麻烦使用IAuthorizationPolicy与WCF和Castle-Windsor

时间:2009-11-16 21:31:09

标签: wcf castle-windsor wcf-security

我目前正在使用Castle-Windsor和WCF Facility来注入我所有的WCF服务。我刚刚开始使用自定义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."
        }
    }
}

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

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

1 个答案:

答案 0 :(得分:1)

当你用PrincipalPermissionAttribute标记类本身时,它有效地告诉运行时,在使用类时,必须满足权限要求。所以现在当Castle-Windsor尝试实例化类时,正在进行权限请求,当然也无法实现,因为此时安全上下文没有正确建立。

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