【发布时间】:2009-11-16 21:31:08
【问题描述】:
我目前正在使用带有 WCF 设施的 Castle-Windsor 来注入我所有的 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() is 被调用时。所以在这一点上,我的新手 .NET/WCF/Castle-Windsor 技能将带我到最远的地方。
有没有办法告诉 Castle-Windsor 在尊重 IAuthorizationPolicy 的同时调用服务构造函数?或者告诉 WCF 需要调用 Evaluate() 来创建类?或者是否有其他方法可以围绕 WCF 做同样的事情?我不想用完全相同的属性声明来标记每一个方法。
【问题讨论】:
标签: wcf castle-windsor wcf-security