C# (WindowsPrincipal vs GenericPrincipal vs ClaimsPrincipal)和#x27;身份属性
TL;博士,我写这篇文章是为了将来可能帮助其他人进行谷歌搜索,因为我没有发现关于这种特殊行为的文档,部分原因是希望有人能够确认(或否认)这是正确的方法(总之,使用.Identity.First()而不是.Identity!) ... 因此,我的团队有一些操纵“索赔”(索赔转换,如果你愿意)的代码,看起来像:C# (WindowsPrincipal vs GenericPrincipal vs ClaimsPrincipal)和#x27;身份属性,c#,authentication,asp.net-identity,wif,claims-based-identity,C#,Authentication,Asp.net Identity,Wif,Claims Based Identity,TL;博士,我写这篇文章是为了将来可能帮助其他人进行谷歌搜索,因为我没有发现关于这种特殊行为的文档,部分原因是希望有人能够确认(或否认)这是正确的方法(总之,使用.Identity.First()而不是.Identity!) ... 因此,我的团队有一些操纵“索赔”(索赔转换,如果你愿意)的代码,看起来像: var claimsIdentity = ((ClaimsIdentity)context.Authentication.User.Identity); var transformedCla
var claimsIdentity = ((ClaimsIdentity)context.Authentication.User.Identity);
var transformedClaims = await this.Transformer.Transform(dbContext, claimsIdentity.Claims);
foreach (var claim in claimsIdentity.Claims.ToList())
{
claimsIdentity.RemoveClaim(claim);
}
claimsIdentity.AddClaims(transformedClaims);
然后是一些“检查”这些声明的代码,如下所示:
((ClaimsPrincipal)context.Authentication.User).HasClaim(permission.ClaimType, permission.ClaimValue);
这段代码一直工作得非常好,直到有人(我)注意到我们的web.config缺少一个
然后,“HasClaim”方法迭代Identity集合,但忽略单个“Identity”属性,因此我们的代码正在操纵(在GenericPrincipal
的情况下)Identity声明的错误实例
考虑到这一点,我浏览了一下互联网,发现当其他人操纵声明时,我会看到如下代码:
var id=ClaimsPrincipal.Current.identies.First();
或
ClaimsIdentity aspNetIdentity=principal.identies.FirstOrDefault(…)
这对所有人都适用GenericPrincipal
、WindowsPrincipal
和ClaimsPrincipal
实例(后两个是因为Identities
的第一个实例通常与Identity
属性相同,第一个是因为'HasClaim'方法查询相同的集合。)
我是否错过了备忘录中说我们需要这样做的地方(我在微软的API文档中看不到对此的任何评论)