Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.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# 编辑asp.net核心标识声明而不是添加它们_C#_Asp.net Core_Identity_Claims_Asp.net Authorization - Fatal编程技术网

C# 编辑asp.net核心标识声明而不是添加它们

C# 编辑asp.net核心标识声明而不是添加它们,c#,asp.net-core,identity,claims,asp.net-authorization,C#,Asp.net Core,Identity,Claims,Asp.net Authorization,我正在为我的asp.net核心mvc网站使用外部登录,登录完成后,我希望将他们用于登录的社交信息(如用户名、个人资料图像等)存储为用户身份声明中的内容 因此,成功登录后,我在我的帐户控制器中运行如下代码: var authClaim = user.Claims.FirstOrDefault(c => c.ClaimType == authToken.Name); if (authClaim == null) externalClaims.Add(new

我正在为我的asp.net核心mvc网站使用外部登录,登录完成后,我希望将他们用于登录的社交信息(如用户名、个人资料图像等)存储为用户身份声明中的内容

因此,成功登录后,我在我的帐户控制器中运行如下代码:

    var authClaim = user.Claims.FirstOrDefault(c => c.ClaimType == authToken.Name);
    if (authClaim == null)
          externalClaims.Add(new Claim(authToken.Name, authToken.Value));
    else
          authClaim.ClaimValue = authToken.Value;

    if (externalClaims.Any())
          await _userManager.AddClaimsAsync(user, externalClaims);

await _userManager.UpdateAsync(user);
但是,当我尝试这样做时,claims表会复制声明,而不是像我预期的那样更新它们,因此每次用户登录时,我都会在表中为该用户获取与上次相同的另一组记录

我是否必须在每次登录时删除它们并重新添加它们?如果没有,我如何更新现有声明而不复制它们

我在每次登录时都这样做,以防用户更改了他们的个人资料或其他信息(并确保我拥有最新的令牌)

我也很好奇为什么要将声明添加到用户的主身份中。用户有一个名为ExternalClaims的属性,但它是空的,似乎没有任何方法更新它。在我看来,这是一个放置这些第三方声明的更好的地方,但我一生都找不到任何方法来修改它


无论哪种方式,如果我使用此代码,我肯定会遇到同样的问题,因此,在登录时删除声明并始终添加新声明是正确的做法,还是我应该做一些不同的事情?

您是否使用项目模板中的UserManager类,或者你有一个自定义的实现吗?看起来确实有一个名为的方法,它可能更适合你要完成的任务。哦哦,这看起来正是我需要的!我正在使用内置的usermanager类,让我尝试一下并报告,非常感谢!是的,我没有在上找到这个方法,但是ASP.NET文档现在有点零碎。如果扩展方法没有出现,您可能必须将该代码复制到扩展方法中。啊,不行,用户中的用户声明是EntityFrameworkCore.IdentityUserClaim和ReplaceSclaimsync是一个常规的安全声明,也许这就是为什么我会得到重复的,因为它们没有完全对齐。。。将继续挖掘,谢谢你的帮助!