(WindowsPrincipal vs GenericPrincipal vs ClaimsPrincipal) 的 Identity 属性

(WindowsPrincipal vs GenericPrincipal vs ClaimsPrincipal)'s Identity property

提问人:ciaranj 提问时间:9/30/2015 更新时间:9/30/2015 访问量:2553

问:

TL;DR.我写这篇文章是为了将来可能帮助其他人在谷歌上搜索,因为我没有发现关于这种特定行为的文档,部分原因是希望有人可以确认(或否认)这是正确的方法(总结使用.Identities.First() 不是 .身份! ... 因此,我的团队有一些代码可以操作“声明”(如果您愿意的话,可以进行声明转换),如下所示:

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”调用不再返回 true。<authentication mode="None">

我们最终将故障追溯到从实例更改为 .具体来说,通读源代码,我可以看到,当在构造函数中传递 GenericPrincipal 时,它的克隆被用作 here 的 Identities 属性中的条目。WindowsPrincipalGenericPrincipalIdentitycontext.Authentication.User

然后,“HasClaim”方法循环访问 Identities 集合,但忽略单个“Identity”属性,因此我们的代码正在操作 (在 的情况下) Identity 声明的错误实例。GenericPrincipal

因此,考虑到这一点,我在互联网上进行了一次浏览,我注意到当其他人操纵声明时,我会看到如下代码: var id = ClaimsPrincipal.Current.Identities.First(); 或 ClaimsIdentity aspNetIdentity = 主体。Identities.FirstOrDefault(...)

这恰好对所有人都有效;和实例(后两个是因为 的第一个实例通常与属性相同,第一个实例是因为“HasClaim”方法查询同一个集合。GenericPrincipalWindowsPrincipalClaimsPrincipalIdentitiesIdentity

我是否错过了备忘录,其中说我们需要这样做(我在 Microsoft 的 API 文档上看不到任何对此的评论)?

C# 身份验证 ASP.NET 标识 WIF 基于声明的标识

评论


答: 暂无答案