ASP.Net Core - 登录后如何等待用户身份立即可用?
Posted
技术标签:
【中文标题】ASP.Net Core - 登录后如何等待用户身份立即可用?【英文标题】:ASP.Net Core - How do I wait for User Identity to be available immediately after signing in? 【发布时间】:2021-02-27 13:44:05 【问题描述】:我有一个相当标准的登录操作,但我想根据用户角色更改重定向。
但是,出现了某种竞争情况:HttpContext.User
表示它没有产生任何结果,导致管理员用户被重定向到错误的主页。
登录后如何正确“等待”直到 HttpContext.User 可用?
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginDto loginDto)
if (!ModelState.IsValid)
return View(loginDto);
var result = await _signInManager.PasswordSignInAsync(loginDto.Username, loginDto.Password, true, false);
if (!result.Succeeded)
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return View(loginDto);
// This check doesn't always work because User = null
if(HttpContext.User.IsInRole(RoleEnum.Administrator.ToString()))
return LocalRedirect(Url.Action("Index", "Home", new area = "Admin" ));
return LocalRedirect(loginDto.ReturnUrl ?? Url.Action("Index", "Home"));
【问题讨论】:
User
仅在身份验证后可用,而不是在登录后可用。登录会为响应设置一些 cookie,但它在 mvc 中间件的范围内,(已经通过了身份验证中间件)。当然,您可以通过某种方式手动设置它。我只是想提供一些关于它为什么不起作用的信息。可能有多种解决方案,包括一种直接基于 Identity 而不涉及中间件管道的解决方案。
【参考方案1】:
在这个范围内使用 UserManager 而不是 HttpContext,如下所示
var userInRole = await _userManager.IsInRoleAsync(user, role);
【讨论】:
以上是关于ASP.Net Core - 登录后如何等待用户身份立即可用?的主要内容,如果未能解决你的问题,请参考以下文章
我应该如何保护我的 Web 应用程序(ASP.Net Core 3.1 MVC)?
带有 Angular 6 的 Asp.Net Core 2.1 中的 Windows 身份验证 - Chrome 连续登录提示
部署后 ASP.Net Core Identity 登录状态丢失