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

Posted

技术标签:

【中文标题】更新 ASP.NET One Core 中的声明值【英文标题】:Update Claims values in ASP.NET One Core 【发布时间】:2016-12-25 21:24:27 【问题描述】:

我在 MVC 6 (Asp.Net One Core) 中有一个 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?最好的解决方案是将其保存到经典会话中?有更好的解决方案吗?我完全错了?

有什么建议吗?

【问题讨论】:

【参考方案1】:

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

例子:

var user = await _userManager.FindByIdAsync(yourId);
await _signInManager.RefreshSignInAsync(user);

查看SignInManager(net 5.0.8)中的RefreshSignInAsync代码: https://github.com/dotnet/aspnetcore/blob/ae2eabad0e49302d0632a7dde917fdc68d960dc4/src/Identity/Core/src/SignInManager.cs#L170

【讨论】:

这个方法可以用来刷新其他用户的声明吗? 如果我没有添加身份,我如何访问 SignInManager 对象,因为这对我来说不是必需的? @DSA 你没有。 SignInManager 是 Identity 的一部分。 @liang 好像不是,as it causes the currently logged in user to become logged in as that 'different' user. 您不能强制刷新其他用户声明。【参考方案2】:

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

答案是肯定的。

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

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

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

【讨论】:

如果我为了再次创建声明而退出并再次登录,那么信息会立即可用,或者必须刷新页面才能更新 cookie 或类似的东西? 旧信息仍附加到 Principal 对象,因此您不希望在同一请求中使用 Principal 执行其他处理。 在此处添加以防万一有人遇到此问题:在我的情况下,我想在同一个请求中立即使用新的索赔信息。为此,我为该用户调用 _userManager.GetClaimsAsync(),而不是读取 Principal 对象中的声明。那里的说法是旧的。调用 GetClaimsAsync() 将为您提供刚刚设置的新值。所以基本上你需要 1) 调用 RefreshSignInAsync,2) 如果你想立即处理新的声明,请调用 GetClaimsAsync。

以上是关于更新 ASP.NET One Core 中的声明值的主要内容,如果未能解决你的问题,请参考以下文章

.NET 6 Preview 5 中的 ASP.NET Core 更新

ASP.NET Core JWT 和声明

ASP.NET Core 身份角色、声明和用户

如何使用基于声明的授权保护 asp.net core 2.1 中的静态文件夹

ASP.NET Core 身份中的角色声明与自定义身份验证中的角色权限相比

更新 ASP.NET Core Entity Framework 中的实体类