假设我有以下角色:
- 管理员
- 用户
authenticationManager.SignIn(new AuthenticationProperties()
{ IsPersistent = false }, impersonatedIdentity);
在.NET Core中,SignIn
参数不再允许传递IdentityResult
类(模拟身份), 只能传递ClaimsPrincipal
。
所以我最终做的是这样的:
public async Task<IActionResult> ImpersonateUserAsync(string userName)
{
var impersonatedUser = await _userManager.FindByNameAsync(userName);
var claims = new List<Claim> {
new Claim(ClaimTypes.Name, impersonatedUser.FirstName, ClaimValueTypes.String),
new Claim(ClaimTypes.Surname, impersonatedUser.LastName, ClaimValueTypes.String),
new Claim(ClaimTypes.Email, impersonatedUser.Email, ClaimValueTypes.String)
};
var user = new ClaimsPrincipal(new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme));
var authenticationManager = _httpContextAccessor.HttpContext.Authentication;
await authenticationManager.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
await authenticationManager.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, user, new AuthenticationProperties() { IsPersistent = false });
return RedirectToAction("Index", "Home");
}
我添加了必要的声明并将其传递给ClaimsPrincipal
,这样SignInAsync
现在可以接受var user
。
然而,这似乎并没有像我预期的那样以AspNetUsers
表中找到的用户身份登录,该用户已经被分配了管理员角色和权限。说实话,我原以为上述代码至少会作为我在var claims
中定义的名称和姓氏进行登录,但事实上,在重定向到Index页面后,我仍然以管理员帐户登录。
为了能够作为在AspNetUsers
表中定义的用户帐户登录,我需要采取哪些正确的步骤,使管理员能够以用户本身的身份浏览应用程序?