【问题标题】:OWIN Middleware's CurrentPrincipal.Identities have different claims setOWIN 中间件的 CurrentPrincipal.Identities 有不同的声明集
【发布时间】:2014-09-28 17:10:47
【问题描述】:

今天我正在为 Oauth 中间件配置授权提供程序,并尝试将一些 guid 值插入到 Thread.CurrentPrincipal.Identity.Claims 中。但是当我尝试调用 Thread.CurrentPrincipal 的 FindFirst 时,我什么都没有。

这是我尝试做的示例:

public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
    var claimsIdentity = Thread.CurrentPrincipal.Identity as ClaimsIdentity;

    if (claimsIdentity != null)
       claimsIdentity.AddClaim(new Claim("TestClaim", Guid.NewGuid().ToString()));

    var claimValue = ((ClaimsPrincipal)Thread.CurrentPrincipal)
        .FindFirst(x => x.Type == "TestClaim"); //claimValue == null!
}

检查内部属性,发现 Thread.CurrentPrincipal.Identity 仍然包含我之前设置的声明,但 Thread.CurrentPrincipal.Identities[0] - 没有。因此,有两个不同的身份实例具有自己的一组声明。

我尝试在 Web Api 控制器的操作中执行相同的步骤,并且 Identity 引用了 Identities[0],这意味着存在相同的实例。

OWIN 中间件的 Currentprincipal 发生了什么,所以它的 Identity 和 Identities[0] 指的是不同的实例?谁能给我解释一下?

谢谢!

【问题讨论】:

    标签: asp.net owin asp.net-web-api2 iprincipal owin-middleware


    【解决方案1】:

    我遇到了同样的问题。我不知道为什么 Identity 属性和 Identities 属性的第一个身份是不同的实例...
    但似乎与 ClaimsPrincipal 类(Claims、FindFirst...)中的声明相关的所有方法都基于 Identities 属性,因此更新 Identity 属性没有任何效果。
    我更喜欢保持两个身份一致,所以我使用以下解决方法来解决问题:

    principal = (ClaimsPrincipal)Thread.CurrentPrincipal
    identity = (ClaimsIdentity)user.Identity;
    identity1 = user.Identities.First();
    identity.AddClaim(claim);
    identity1.AddClaim(claim);
    

    【讨论】:

      猜你喜欢
      • 2015-04-05
      • 1970-01-01
      • 2015-02-16
      • 2017-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-05
      • 2017-06-01
      相关资源
      最近更新 更多