1

現在、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 の他の方法はありますか? すべてのメソッドをまったく同じ属性宣言でマークアップする必要はありません。

4

1 に答える 1

1

クラス自体を でマークアップするとPrincipalPermissionAttribute、クラスが使用される時点でアクセス許可の要求を満たす必要があることをランタイムに効果的に伝えます。そのため、Castle-Windsor がクラスをインスタンス化しようとすると、アクセス許可の要求が行われますが、その時点でセキュリティ コンテキストが正しく確立されていないため、もちろん要求を満たすことはできません。

AFAIKPrincipalPermissionAttributeは、純粋な.NETの観点からは許可されていますが、ランタイムの性質上、WCFのクラスレベルではサポートされていません。したがって、Castle-Windsor は同じ理由でサービス インスタンスを作成できません。

于 2009-11-17T04:14:18.340 に答える