C# 更新ASP.NET One Core中的索赔值

C# 更新ASP.NET One Core中的索赔值,c#,asp.net,asp.net-mvc,claims-based-identity,asp.net-identity-3,C#,Asp.net,Asp.net Mvc,Claims Based Identity,Asp.net Identity 3,我在MVC6(Asp.NETOneCore)中有一个Web应用程序,我正在使用基于声明的身份验证。在登录方法中,我设置声明: var claims = new Claim[] { new Claim("Name", content.Name), new Claim("Email", content.Email), new Claim("RoleId", content.RoleId.ToString()), }; var ci = new ClaimsIdentity(

我在MVC6(Asp.NETOneCore)中有一个Web应用程序,我正在使用基于声明的身份验证。在登录方法中,我设置声明:

var claims = new Claim[]
{
    new Claim("Name", content.Name),
    new Claim("Email", content.Email),
    new Claim("RoleId", content.RoleId.ToString()),
};

var ci = new ClaimsIdentity(claims, "password");
await HttpContext.Authentication.SignInAsync("Cookies", new ClaimsPrincipal(ci));
现在,如果用户更改了用户配置文件中的电子邮件,我如何更改“电子邮件”声明的电子邮件值?我必须再次SignOutAsync和SignInAsync才能更新cookie?最好的解决方案是将其保存到经典会话中?有更好的解决办法吗?我完全错了

有什么建议吗

我必须再次SignOutAsync和SignInAsync才能更新 饼干

答案是肯定的

最简单的方法是,您可以在更新电子邮件的同一操作方法中手动注销和登录(再次创建索赔)

最好的解决方案是将其保存到经典会话中


我建议不要那样做。在ASP.Net MVC中,显式使用会话状态是一种不好的做法。

另一个选项,而不是
SignOutAsync
SignInAsync
,是使用
RefreshSignInAsync

例如:

var user=await\u userManager.FindByIdAsync(yourId);
等待(u signInManager.RefreshSignInAsync)(用户);;
查看
SignInManager
(netcore 3.1.8)中的
RefreshSignInAsync
代码:

如果我注销并再次登录以再次创建声明,则此时信息可用,或者必须刷新页面以更新cookie或类似内容?旧信息仍然附加到主体对象,因此,您不希望在同一请求中使用Principal执行其他流程。请在此处添加此项,以防有人遇到此问题:在我的情况下,我希望在同一请求中立即使用新的索赔信息。为此,我为该用户调用了_userManager.GetClaimsAsync(),而不是读取主体对象中的声明。那里的主张是旧的。调用GetClaimsAsync()将为您提供刚刚设置的新功能。因此,基本上你需要1)调用RefreshSignInAsync,2)调用GetClaimsAsync,如果你想立即处理新的声明。这个方法可以用来刷新其他用户的声明吗?如果我没有添加标识,我如何访问SignInManager对象,因为这对我来说是不必要的?@DSA你没有。SignInManager是Identity的一部分。@liang似乎不是。您不能强制刷新其他用户声明。