5

データへのアクセスを許可するために、URLにAPIキーを要求する方法、またはサービスに秘密キーを渡す他の方法はありますか?

私は今これを持っています...

using System;
using System.Data.Services;
using System.Data.Services.Common;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel.Web;
using Numina.Framework;
using System.Web;
using System.Configuration;

[System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class odata : DataService {


    public static void InitializeService(DataServiceConfiguration config) {

        config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
        //config.SetServiceOperationAccessRule("*", ServiceOperationRights.All);
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
    }

    protected override void OnStartProcessingRequest(ProcessRequestArgs args) {

        HttpRequest Request = HttpContext.Current.Request;
        if(Request["apikey"] != ConfigurationManager.AppSettings["ApiKey"])
            throw new DataServiceException("ApiKey needed");

        base.OnStartProcessingRequest(args);
    }
} 

...これは機能しますが、メタデータを取得してサービス参照の追加エクスプローラーからサービスを検出できないため、完全ではありません。$ metadataがURLに含まれているかどうかを確認できましたが、ハックのようです。もっと良い方法はありますか?

4

3 に答える 3

5

クエリ文字列で渡すのではなく、認証ヘッダーを使用してapiKeyを渡すことをお勧めします。それが目的であり、APIキーをログファイルから除外するのに役立ちます。

URLに「$metadata」が含まれているかどうかを確認することには、特に問題はないと思います。サーバー側のコードを記述していて、サーバーがURIスペースを所有しているため、リクエストURLのテキストに基づいて決定を下すことが、サーバーのすべてです。次のようなものを使用できます

  if (requestUrl.Segments.Last().Replace('/','') != '$metadata') 

uri文字列全体を検索する代わりに、不快感を軽減する場合は!

于 2010-03-20T12:46:07.947 に答える
1

このビデオで紹介されている手法は、WCFデータサービスでもうまく機能しているようです。のカスタムサブクラスを作成しServiceAuthorizationManagerMSDNを参照)、オーバーライドCheckAccessCore()して、web.configに登録します。

リクエストのHTTPヘッダーでキーを渡すことで機能するようになりました。にOperationContext渡されるとCheckAccessCore、HTTPリクエストヘッダーを取得する方法は提供されませんが、を介して取得できますHttpContext.Current.Request.Headers。次に、そのコレクションから適切なヘッダーを取得して、必要に応じてチェックできます。

web.configで必要な登録は次のとおりです。

<system.serviceModel>
  <behaviors>
      <serviceBehaviors>
          <behavior>
              <serviceAuthorization serviceAuthorizationManagerType="FullyQualifiedTypeNameHere, ProjectNameHere" />
          </behavior>
      </serviceBehaviors>
  </behaviors>

更新:ヘッダーを取得できることについて間違っていましたHttpContext.Current.Request.Headers; HttpContext.CurrentIISで実行している場合はnullです(ただし、デバッグ時にはそうではありません)。代わりに、この質問WebOperationContext.Current.IncomingRequest.Headersに従って使用してください。

更新2: HttpContext.Current ASP.NET互換モードでWCFを実行していない場合にのみnullになります。これをオンにするには、system.serviceModelノードのアプリケーションレベルでweb.configに次の行を追加します。

<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>

また、ADO.NETサービスに加えてバニラWCFサービスを実行している場合は、サービスの実装の上にこれを追加します。

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]

その後、クラスHttpContext.Current.Request.Headersが提供する他のすべてのものを取得できます。HttpRequest

于 2012-05-30T20:09:18.440 に答える
0

リクエストタイプを確認して、APIキーなしでwsdl呼び出しを実行させることができます。

APIの目標が何かわかりませんが、クライアント証明書を使用できます。

于 2010-03-20T04:32:13.170 に答える