OWIN Middleware的CurrentPrincipal.Identities有不同的声明集

时间:2014-08-05 21:53:30

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

今天我正在为Oauth中间件配置授权提供程序,并尝试在Thread.CurrentPrincipal.Identity.Claims中插入一些guid值。但是当我试图调用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发生了什么,所以它的身份和身份[0]指的是不同的实例?有人可以解释一下吗?

谢谢!

1 个答案:

答案 0 :(得分: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);