Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# (WindowsPrincipal vs GenericPrincipal vs ClaimsPrincipal)和#x27;身份属性_C#_Authentication_Asp.net Identity_Wif_Claims Based Identity - Fatal编程技术网

C# (WindowsPrincipal vs GenericPrincipal vs ClaimsPrincipal)和#x27;身份属性

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

TL;博士,我写这篇文章是为了将来可能帮助其他人进行谷歌搜索,因为我没有发现关于这种特殊行为的文档,部分原因是希望有人能够确认(或否认)这是正确的方法(总之,使用.Identity.First()而不是.Identity!) ... 因此,我的团队有一些操纵“索赔”(索赔转换,如果你愿意)的代码,看起来像:

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文档中看不到对此的任何评论)