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