c# - 为什么我的 IAuthorizationPolicy 没有使用我的 CustomPrincipal 设置 Thread.CurrentPrincipal?

标签 c# wcf wcf-security

对于我的 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>

我尝试使用反射器查看发生了什么,但没有看到任何有用的信息。

我做错了吗?是否缺少某些配置?

最佳答案

对于围绕这个问题的风滚草,我并不感到惊讶。我在问题中详述的方法没有任何问题。

原来问题是我使用的是自定义 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);
}

当然,我很想知道是否有更优雅的解决方案。

关于c# - 为什么我的 IAuthorizationPolicy 没有使用我的 CustomPrincipal 设置 Thread.CurrentPrincipal?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3364921/

相关文章:

c# - 通过 WMI 确定网络适配器类型

c# - 在Python中动态进行多处理

具有不想工作的 WCF 服务的 WCF 新手(我认为是元数据)

c# - 如何在返回的类上实现接口(interface)并保留其数据?

.net - 使用真实 IP 加密发送到托管在服务器上的 WCF 服务的消息

c# - WCF 错误 - 安全处理器无法在消息中找到安全 header

wcf - "Cannot load the X.509 certificate identity specified in the configuration"

c# - 如何将程序集加载到内存中并执行

C# Null 传播——魔法在哪里发生?

c# - WCF 数据库包装器