基于Razor和ASP.NET Identity Core的角色,登录后将用户重定向到特定页面



我已经搭建了标识页面,我正在尝试更新Login.cshtml.cs,以便在成功登录后将用户重定向到特定页面。

var result = await _signInManager.PasswordSignInAsync(Input.Username, Input.Password, Input.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
_logger.LogInformation("User logged in.");
if(User.IsInRole("Business User"))
{
return Redirect("~/BusinessDashboard");
}
return LocalRedirect(returnUrl);
}

我还试着把第5行改成:

if(User.HasClaim("role", "Business User"))

我知道,一旦这个特定的用户登录,它肯定会拥有";业务用户";因为我打印声明是为了检查它们(我通过配置IdentityServer在启动文件中添加了角色作为声明(。然而,当我在上面的代码上设置断点并选中User时,此时看起来并没有实际分配任何声明。也许这就是问题所在,但如果是这样的话,我不知道该如何解决?

我在其他地方读到,在ASP.NET Identity工作流的这一点上,用户并没有真正定义,所以我需要使用UserManager的一个实例,根据他们在登录输入字段中输入的用户名来获取用户,然后我就可以使用我获得的用户信息来获取可以确定重定向的角色。

下面的代码是我的OnPostAsync方法的更新版本,该方法包含在您构建Identity页面时获得的Login.cshtml.cs文件中。

public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl ??= Url.Content("~/");
ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();

if (ModelState.IsValid)
{
// This doesn't count login failures towards account lockout
// To enable password failures to trigger account lockout, set lockoutOnFailure: true
var result = await _signInManager.PasswordSignInAsync(Input.Username, Input.Password, Input.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
_logger.LogInformation("User logged in.");
var user = await _userManager.FindByNameAsync(Input.Username);
var roles = await _userManager.GetRolesAsync(user);
if (roles.Contains("Business User"))
{
return Redirect("~/BusinessDashboard");
}
return LocalRedirect(returnUrl);
}
if (result.RequiresTwoFactor)
{
return RedirectToPage("./LoginWith2fa", new { ReturnUrl = returnUrl, RememberMe = Input.RememberMe });
}
if (result.IsLockedOut)
{
_logger.LogWarning("User account locked out.");
return RedirectToPage("./Lockout");
}
else
{
ModelState.AddModelError(string.Empty, "Invalid login attempt.");
return Page();
}
}
// If we got this far, something failed, redisplay form
return Page();
}

最新更新