对于我的WCF服务,我已经实现了IAuthorizationPolicy并将其连接起来(并且可以确认它已被使用)。
在Evaluate()方法中,我设置了一个自定义主体,如下所示:
evaluationContext.Properties["Principal"] = myCustomPrincipal;
但是,当调用服务时,Thread.CurrentPrincipal是GenericPrincipal!
我的服务行为配置如下:
<serviceAuthorization principalPermissionMode="Custom">
<authorizationPolicies>
<add policyType="MyNamespace.MyPrincipalAuthorizationPolicy, MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</authorizationPolicies>
</serviceAuthorization>
我尝试使用反射器来查看发生了什么,但没有看到任何有用的东西。
我做错了吗?是否有一些我缺少的配置?
答案 0 :(得分:5)
我不会惊讶地看到风滚滚动这个问题。我在问题中详述的方法没有任何问题。
事实证明问题在于我使用的是自定义IInstanceProvider
(我甚至不认为包含该信息)。如果我停止使用自定义实例提供程序一切正常。但这并不好,因为我仍然想要使用它。
所以我发现唯一的解决方案是在实例提供程序中手动设置线程的当前主体。
诀窍是抓住我在IAuthorizationPolicy
中设置的校长 - 我最终通过静态OperationContext.Current
使用相当麻烦的调用找到了它。
public object GetInstance(InstanceContext instanceContext, Message message)
{
var principal =
OperationContext.Current.ServiceSecurityContext.AuthorizationContext.Properties["Principal"]
as MyPrincipal;
if (principal != null)
Thread.CurrentPrincipal = principal;
return ObjectFactory.GetInstance(_serviceType);
}
当然,我有兴趣知道是否有更优雅的解决方案。