今天我正在为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]指的是不同的实例?有人可以解释一下吗?
谢谢!
答案 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);