今天我正在为Oauth中间件配置授权提供者,并试图在Thread.CurrentPrincipal.Identity.Claims中插入一些指导值。但当我试着打电话给Thread。CurrentPrincipal的FindFirst I've got nothing.
下面是我想做的例子:
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. identity。恒等式[0]-不。所以有两种不同的身份实例,有各自的主张。
我试图在Web Api控制器的动作中做相同的步骤,那里的Identity引用了Identity[0],这意味着有相同的实例。
OWIN中间件的Currentprincipal发生了什么,所以它的Identity和Identities[0]指的是不同的实例?有人能给我解释一下吗?
谢谢!
我遇到了同样的问题。我不知道为什么Identity属性和Identity属性的第一个身份是不同的实例…
但是,似乎所有与claimprincipal类(claims、FindFirst…)中声明相关的方法都基于Identity属性,因此更新Identity属性没有影响。
我更喜欢保持两个身份一致,所以我使用以下解决方法来解决问题:
principal = (ClaimsPrincipal)Thread.CurrentPrincipal
identity = (ClaimsIdentity)user.Identity;
identity1 = user.Identities.First();
identity.AddClaim(claim);
identity1.AddClaim(claim);