在WCF和Castle Windsor中使用IAuthorizationPolicy时遇到问题

在WCF和Castle Windsor中使用IAuthorizationPolicy时遇到问题,wcf,castle-windsor,wcf-security,Wcf,Castle Windsor,Wcf Security,我目前正在使用Castle Windsor和WCF设施来注入我所有的WCF服务。我刚刚开始使用自定义的IAuthorizationPolicy添加权限要求,在服务的每个方法上添加权限要求似乎都有效,但当服务类本身标记了这些要求时,我会抛出一个异常 我已经根据上一个例子进行了设置。我没有设置自定义HTTP模块类,因为我使用的是现有的成员身份实现。我的IAuthorizationPolicy实现(HttpContextPrincipalPolicy)基本相同 我的Web.config的基本部分是:

我目前正在使用Castle Windsor和WCF设施来注入我所有的WCF服务。我刚刚开始使用自定义的
IAuthorizationPolicy
添加权限要求,在服务的每个方法上添加权限要求似乎都有效,但当服务类本身标记了这些要求时,我会抛出一个异常

我已经根据上一个例子进行了设置。我没有设置自定义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>
如果这是在
OperationContract
方法上进行的,则一切正常。但是,如果它被移动到类本身(实现了
ServiceContract
),我会得到以下异常(大部分额外的内容被删除):

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


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

当您用一个标记来标记类本身时,它实际上是在告诉运行时,在使用该类时,必须满足权限要求。因此,当Castle Windsor尝试实例化该类时,权限需求正在生成,当然无法满足,因为此时未正确建立安全上下文


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

当您将类本身标记为时,实际上是在向运行时表明,在使用该类时,必须满足权限要求。因此,当Castle Windsor尝试实例化该类时,权限需求正在生成,当然无法满足,因为此时未正确建立安全上下文


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

这似乎与我看到的情况相符。我想知道,有没有其他方法可以做类似的事情,而不必标记每个方法?如果您正在编写自己的IAuthorizationPolicy,您可以做任何您想做的事情。因此,如果您想创建一个安全模型,其中访问是在服务级别控制的,那么您可以检查当前标识上的声明,看看是否允许他们访问该服务。唯一的区别是您负责以自己的形式存储访问控制列表数据,而不是使用PrincipalPermissionAttribute。这可以是您自己编写的自定义属性,也可以将其存储在数据库/配置文件中的静态代码之外。我想知道,有没有其他方法可以做类似的事情,而不必标记每个方法?如果您正在编写自己的IAuthorizationPolicy,您可以做任何您想做的事情。因此,如果您想创建一个安全模型,其中访问是在服务级别控制的,那么您可以检查当前标识上的声明,看看是否允许他们访问该服务。唯一的区别是您负责以自己的形式存储访问控制列表数据,而不是使用PrincipalPermissionAttribute。这可以是您自己编写的自定义属性,也可以将其存储在数据库/配置文件中的静态代码之外。
[PrincipalPermission(SecurityAction.Demand, Role = RoleNames.USER_ADMINISTRATION)]
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."
        }
    }
}