我目前正在使用 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 做同样的事情?我不想用完全相同的属性声明位标记每个方法。