我目前正在使用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做同样的事情?我不想用完全相同的属性声明来标记每个方法。
答案 0 :(得分:1)
当你用PrincipalPermissionAttribute
标记类本身时,它有效地告诉运行时,在使用类时,必须满足权限要求。所以现在当Castle-Windsor尝试实例化类时,正在进行权限请求,当然也无法实现,因为此时安全上下文没有正确建立。
ACFIK,由于其运行时的性质,WCF的类级别不支持PrincipalPermissionAttribute
,即使从纯.NET的角度来看它是允许的。因此,Castle-Windsor因同样的原因无法创建您的服务实例。