現在、Castle-Windsor を WCF 機能と共に使用して、すべての WCF サービスを注入しています。custom を使用してアクセス許可要件の追加を開始したところですIAuthorizationPolicy
。これは、サービスのメソッドごとに実行すると機能するようですが、サービス クラス自体が要件でマークアップされると、例外がスローされます。
How To – Use Username Authentication with Transport Security in WCF from Windows Formsの例に基づいて設定しました。Membership
既存の実装を使用しているため、カスタム HTTP モジュール クラスは設定しませんでした。私のIAuthorizationPolicy
実装 ( HttpContextPrincipalPolicy
) は本質的に同じです。
私の本質的な部分Web.config
は次のとおりです。
<serviceBehaviors\>
<behavior name="MyBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
<serviceAuthorization principalPermissionMode="UseAspNetRoles"
roleProviderName="UserProvider">
<authorizationPolicies>
<clear/>
<add policyType="Website.FormsAuth.HttpContextPrincipalPolicy,Website"/>
</authorizationPolicies>
</serviceAuthorization>
</behavior>
</serviceBehaviors>
メソッドに要件を設定すると、すべてがうまくいくようです。これは次のように行われています。
[PrincipalPermission(SecurityAction.Demand, Role = RoleNames.USER_ADMINISTRATION)]
これがOperationContract
メソッド上にある場合、物事は期待どおりに機能します。ただし、クラス自体 ( を実装するServiceContract
) に移動すると、次の例外が発生します (余分なもののほとんどが取り除かれます)。
Castle.MicroKernel.ComponentActivator.ComponentActivatorException {
Message = "ComponentActivator: could not instantiate Services.UserService"
InnerException = System.Reflection.TargetInvocationException {
Message = "Exception has been thrown by the target of an invocation."
InnerException = System.Security.SecurityException {
Message = "Request for principal permission failed."
}
}
}
デバッグしたところ、コンストラクターHttpContextPrincipalPolicy
が呼び出されていることがわかりましたEvaluate()
が、要求がクラスにアタッチされているときではありません。Evaluate()
メソッドが呼び出されているときにアタッチされます。したがって、この時点で、初心者の .NET/WCF/Castle-Windsor スキルが私を連れて行ってくれるところまで行きました。
を尊重しながらCastle-Windsorにサービスコンストラクターを呼び出すように指示する方法はありIAuthorizationPolicy
ますか? Evaluate()
または、クラスの作成のために呼び出す必要があることをWCF に伝えますか? または、同じことを行う WCF の他の方法はありますか? すべてのメソッドをまったく同じ属性宣言でマークアップする必要はありません。