1

我目前正在使用 Castle-Windsor 和 WCF 设施来注入我所有的 WCF 服务。我刚刚开始使用 custom 添加权限要求IAuthorizationPolicy,这在服务上按方法完成时似乎可以工作,但是当服务类本身被标记为要求时,我会抛出异常。

我已经根据How To – Use Username Authentication with Transport Security in WCF from Windows Forms 中的示例进行了设置。我没有设置自定义 HTTP 模块类,因为我使用的是现有Membership实现。我的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."
        }
    }
}

我已经调试并发现构造函数 onHttpContextPrincipalPolicy被调用但Evaluate()不是当需求附加到类时。当它附加到正在调用的方法Evaluate() 时。所以在这一点上,我已经达到了我的新手 .NET/WCF/Castle-Windsor 技能的水平。

有没有办法告诉 Castle-Windsor 在尊重IAuthorizationPolicy? 或者告诉 WCFEvaluate()需要调用来创建类?或者是否有其他方法可以围绕 WCF 做同样的事情?我不想用完全相同的属性声明位标记每个方法。

4

1 回答 1

1

当你用 a 标记类本身时,PrincipalPermissionAttribute它实际上是在告诉运行时,在使用该类时必须满足权限要求。因此,现在当 Castle-Windsor 尝试实例化该类时,正在提出许可要求,当然它无法满足,因为此时没有正确建立安全上下文。

AFAIK,PrincipalPermissionAttribute由于其运行时的性质,在 WCF 的类级别上不受支持,即使从纯 .NET 角度来看也是允许的。因此,Castle-Windsor 出于同样的原因无法创建您的服务实例。

于 2009-11-17T04:14:18.340 回答