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)?

ASP.NET Core MVC,用户登录后限制查看

带有 Angular 6 的 Asp.Net Core 2.1 中的 Windows 身份验证 - Chrome 连续登录提示

部署后 ASP.Net Core Identity 登录状态丢失

如何使用 ASP.Net Core Identity 从登录用户中检索 Google 个人资料图片?

我如何在登录 asp.net core razor 之前显示加载图标或禁用按钮