かを実装するAPIキー、WCFサービス?
質問
があるので、必要とするAPIキーのURL/またはその他のサービスの鍵のための助成金へのアクセスデータはもらえますか?
しています。
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);
}
}
...この作品にもなることができないため、車でのメタデータを発見するサービスの追加サービスを参照以下のように変更しました。思を確認す$メタデータのurlものと思われhack.ありそうです。
解決
私は、クエリ文字列にそれを渡すのではなく、APIKEYを渡すために認証ヘッダーを使用してお勧めします。これは、ログファイルのうち、APIキーを維持するために、それがためにそこにあり、それは助けのものです。
私は、URLの「$メタデータ」の存在をチェックすると、実際に何か問題があるとは思いません。リクエストURLのテキストに基づいて意思決定を行うことは、サーバーがすべてに約あるものですので、あなたは、サーバー側のコードを書いている、そしてサーバーがURIスペースを所有しています。 あなたが好きなものを使用することができ、
if (requestUrl.Segments.Last().Replace('/','') != '$metadata')
代わりに、それはそれはあまり不快に感じさせる場合、全体のURI文字列を検索する!
他のヒント
ようにな技術を発表 このビデオ ももピンをもたらします。作成するカスタムクラスのサブクラス ServiceAuthorizationManager
参照 MSDN),オーバーライド CheckAccessCore()
, 登録することでした。config.
ログインしてくださる事によりキーは、HTTPヘッダになります。の OperationContext
渡される CheckAccessCore
しない方を鷲掴みにし、HTTPリクエストヘッダー, ものまでバラバラになっても大丈夫で経由 HttpContext.Current.Request.Headers
.その後の適切なヘッダの集でそれを確認し必要があります。
ここでは登録が必要です。config:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceAuthorization serviceAuthorizationManagerType="FullyQualifiedTypeNameHere, ProjectNameHere" />
</behavior>
</serviceBehaviors>
</behaviors>
更新: 私は間違いされるヘッダ出 HttpContext.Current.Request.Headers
; HttpContext.Current
がnullの場合は実行している場合IISも興味深いのは,デバッグを開始しています).代わりに使用します WebOperationContext.Current.IncomingRequest.Headers
として この質問.
更新2: HttpContext.Current
がnullの場合が低くなりがちだし、必要にWCF ASP.NET 互換性モードになります。でき、この追加のインストールージが表示されます。configのアプリケーションレベルの system.serviceModel
ノード:
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
もこの実装のサービスとした場合、バニラ、WCFサービスに走りに加え、ADO.NET サービス:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
にしき HttpContext.Current.Request.Headers
すべてのその他のもの HttpRequest
クラスです。
あなたが要求タイプをチェックして、WSDLの呼び出しがAPIキーアウトして通過させることができます。
私はあなたのAPIの目標はあるが、あなたは、クライアント証明書を使用することができないことを確認するものです。