【问题标题】:Claims in Thread.CurrentPrincipal are getting lost which are set in AfterReceiveRequest in WCF在 WCF 的 AfterReceiveRequest 中设置的 Thread.CurrentPrincipal 中的声明正在丢失
【发布时间】:2013-05-05 17:05:38
【问题描述】:

我正在使用Microsoft.IdentityModel.dll 设置并获取WCF 中的声明。我还实施了MessageInspectors 来设置索赔。所以,我从客户端添加ClaimsIdentity 用于请求标头,如下所示。

public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)
{
    var claims = new List<Claim> { new Claim(UserIdClaim, "12345"), };
    ClaimsIdentity claimsIdentity = new ClaimsIdentity(claims);
    MessageHeader<ClaimsIdentity> header = new MessageHeader<ClaimsIdentity>(claimsIdentity);
    var untypedHeader = header.GetUntypedHeader(ClaimsName, ClaimsNameSpace);
    request.Headers.Add(untypedHeader);

    return null;
}

还有服务端,

public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)
{
    ClaimsIdentity claimsIdentity = request.Headers.GetHeader<ClaimsIdentity>(ClaimsName, ClaimsNameSpace);
    var claimsIdentitylst = new ClaimsIdentityCollection(new List<IClaimsIdentity> { claimsIdentity });
    IClaimsPrincipal claimsPrincipal = new ClaimsPrincipal(claimsIdentitylst);
    Thread.CurrentPrincipal = claimsPrincipal;

    return null;
}

我正在尝试访问在AfterReceiveRequest 中设置的方法实现(OperationContract)中的声明值,如下所示。但是Thread.CurrentPrincipal 中没有声明。

var userIdClaim = ((IClaimsIdentity)Thread.CurrentPrincipal.Identity).Claims.First(c => c.ClaimType == UserIdClaim);

userIdClaim 在这里为空。

有什么想法吗?

【问题讨论】:

  • AfterReceiveRequest 内的 Thread.CurrentPrincipal 中的调试是否显示声明?
  • @DanilaPolevshikov,它有。

标签: wcf wif endpoint idispatchmessageinspector iclientmessageinspector


【解决方案1】:

嗯 - 除了你正在做的非常不常见的做法 - WCF 管道中只有一个地方可以安全地设置 Thread.CurrentPrincipal。当 PrincipalPermissionMode 设置为 Custom 时,这是在服务授权管理器中。

通常,您宁愿将声明作为安全令牌(如 SAML)的一部分传递,并让 WCF 为您执行服务器端管道。

【讨论】:

  • 任何代码示例来实现这个或任何博客将详细解释?我没有得到清晰的图片。
【解决方案2】:

您可能有充分的理由手动执行此操作,但在 wcf 中传递身份是使用 wsFederationHttpBinding 开箱即用地处理的。您可以在 WIF SDK 或在线 http://msdn.microsoft.com/nl-be/library/aa355045.aspx 中找到示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 2018-04-03
    • 2014-01-24
    相关资源
    最近更新 更多