比方说,我有以下作用:ASP.NET核心身份冒充特定的用户
联系
用户
我想管理员角色模仿与特定的用户帐户用户角色,但不知道特定用户帐户的密码。
管理员应该能够模拟应用程序中的任何用户,并能够以用户自己的身份浏览应用程序。 I found a link其中这实际上是在ASP.NET MVC 4.6中实现的,但在将其转换为Core版本时遇到一些麻烦。
晴的代码链接
authenticationManager.SignIn(new AuthenticationProperties()
{ IsPersistent = false }, impersonatedIdentity);
凡在.NET核心SignIn
参数不允许IdentityResult
类(impersonatedIdentity)再被传递的最后一行的原因。现在只能拿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
中定义的名称和姓氏,但事实上,我仍然以管理员帐户登录后,我被重定向到索引页面。
为了以AspNetUsers
表中定义的用户帐户登录,我需要采取哪些适当步骤,以便Admin能够以用户自己的身份浏览应用程序?
首先,非常小心地实施这种功能,因为它可能会使您承担法律责任,尤其是在您处理信用卡信息或健康信息时。其次,您需要提供一些审计功能,指示用户已被模拟,以便可以证明它是否是模拟用户的真正用户做了某事。 –
感谢您的建议,但我们已经与客户达成了协议,请不要担心。任何想法/方法来解决这个问题? – pavilion
你有没有尝试过这里的解决方案:https://stackoverflow.com/a/42059249/61164 - 请注意,这使用SigninManager,而不是AuthenticationManager。 –