ServiceAuthorizationManager
HTTP Authorization ヘッダーの承認を処理するために、WCF サービスの実装を検討する必要があります。
から継承するクラスを作成し、System.ServiceModel.ServiceAuthorizationManager
1 つ以上のCheckAccess
関数をオーバーライドして、着信 Web 要求を調べ、それを許可するか拒否するかを決定します。ラフスケッチ:
public class MyServiceAuthorizationManager: System.ServiceModel.ServiceAuthorizationManager
{
public override bool CheckAccess(OperationContext operationContext, ref Message message)
{
var reqProp = message.Properties[HttpRequestMessageProperty.Name] as HttpRequestMessageProperty;
var authHeader = reqProp.Headers[HttpRequestHeader.Authorization];
var authorized = // decide if this message is authorized...
if (!authorized)
{
var webContext = new WebOperationContext(operationContext);
webContext.OutgoingResponse.StatusCode = HttpStatusCode.Unauthorized;
webContext.OutgoingResponse.Headers.Add(HttpResponseHeader.WwwAuthenticate, String.Format("Bearer realm=\"{0}\"", baseUri.AbsoluteUri));
}
return authorized;
}
}
これを、サービス ホストを作成する WCF サービスに接続します。
restAPIServiceHost = new DataServiceHost(typeof(API.RestAPIService), restUris);
var saz = restAPIServiceHost.Description.Behaviors.Find<ServiceAuthorizationBehavior>();
if (saz == null)
{
saz = new ServiceAuthorizationBehavior();
restAPIServiceHost.Description.Behaviors.Add(saz);
}
saz.ServiceAuthorizationManager = new MyServiceAuthorizationManager();
restAPIServiceHost.Open();
これにより、サービス メソッド自体を変更する必要なく、WCF サービスによって公開されるすべてのメソッドに承認チェックが挿入されます。
MyServiceAuthorizationManager の実装は、web.config マジックを使用して WCF サービスにインストールすることもできますが、直接のコードの方が理解しやすく、デバッグしやすいと思います。
複数の認証チェック システムを同じサービスに適用することは、互いに衝突したり、セキュリティ カバレッジにギャップを残したりすることなく行うのは難しいことに注意してください。SOAP ユーザー資格情報のケースを処理する権限がある場合UserNamePasswordValidator
、HTTP Authorization ヘッダーのみを含むメッセージは拒否されます。同様に、ServiceAuthorizationManager
HTTP Authorization ヘッダーのみをチェックする は、SOAP ユーザー資格情報を含む Web 要求に失敗します。おそらく、同じ認証チェックで両方の種類の認証資格表現をチェックする方法を理解する必要があります。たとえば、上記の CheckAccess 関数にコードを追加して、HTTP Authorization ヘッダーがメッセージに存在しない場合に SOAP ユーザー資格情報を検索、抽出、およびテストできます。
複数の認証表現を受け入れる必要がある場合は、優先順位も決定する必要があります。HTTP Authorization ヘッダーが存在する場合、SOAP メッセージに含まれるすべてのものよりも優先されるはずです。HTTP Authorization ヘッダーが存在するが無効な場合、完全停止 - リクエストを無許可として拒否します。SOAP に何が含まれているかは問題ではありません。無効な HTTP Authorization ヘッダーは常に悪いニュースです。HTTP Authorization ヘッダーがまったくない場合は、SOAP ユーザーの資格情報を取得して有効性をテストできる SOAP セキュリティ要素があるかどうかを調べることができます。