为什么我的IAuthorizationPolicy不使用我的CustomPrincipal设置Thread.CurrentPrincipal?

stu*_*ell 5 c# wcf wcf-security

对于我的WCF服务,我已经实现了IAuthorizationPolicy并将其连接起来(并且可以确认它正在被使用).

在Evaluate()方法中,我设置了一个自定义主体,如下所示:

evaluationContext.Properties["Principal"] = myCustomPrincipal;
Run Code Online (Sandbox Code Playgroud)

但是,当调用服务时,Thread.CurrentPrincipal是GenericPrincipal!

我的服务行为配置如下:

<serviceAuthorization principalPermissionMode="Custom">
    <authorizationPolicies>
        <add policyType="MyNamespace.MyPrincipalAuthorizationPolicy, MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
    </authorizationPolicies>
</serviceAuthorization>
Run Code Online (Sandbox Code Playgroud)

我试图使用反射器来查看发生了什么,但没有看到任何有用的东西.

我做错了吗?我缺少一些配置吗?

stu*_*ell 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);
}
Run Code Online (Sandbox Code Playgroud)

当然,我有兴趣知道是否有更优雅的解决方案.