2

今天我正在为 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] 指的是不同的实例?谁能给我解释一下,好吗?

谢谢!

4

1 回答 1

0

我遇到了同样的问题。我不知道为什么 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-10-29T23:05:01.830 回答