在ASP.NET One Core中更新声明值

Mar*_*tín 9 c# asp.net asp.net-mvc claims-based-identity asp.net-identity-3

我在MVC 6(Asp.Net One Core)中有一个Web应用程序,我正在使用基于声明的身份验证.在Login方法中,我设置了声明:

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));
Run Code Online (Sandbox Code Playgroud)

现在,如果用户例如更改了用户配置文件中的电子邮件,我该如何更改"电子邮件"声明的电子邮件值?为了更新cookie,我必须再次使用SignOutAsync和SignInAsync吗?最好的解决方案是将其保存到经典会话中吗?还有更好的解决方案吗?我完全错了?

有什么建议?

ozz*_*ald 25

另一种选择,而不是SignOutAsyncSignInAsync,是使用RefreshSignInAsync.

例:

var user = await _userManager.FindByIdAsync(yourId);
await _signInManager.RefreshSignInAsync(user);
Run Code Online (Sandbox Code Playgroud)


Win*_*Win 6

我必须再次 SignOutAsync 和 SignInAsync 才能更新 cookie?

答案是肯定的。

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

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

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

  • 在这里添加这个以防万一有人遇到这个:在我的情况下,我想在同一个请求中立即使用新的声明信息。为此,我为该用户调用 _userManager.GetClaimsAsync() 而不是读取 Principal 对象中的声明。那里的说法是旧的。调用 GetClaimsAsync() 将为您提供刚刚设置的新值。所以基本上你需要 1) 调用 RefreshSignInAsync,2) 调用 GetClaimsAsync 如果你想立即处理新的声明。 (2认同)