ASP.NET Core Identity 模拟特定用户
ASP.NET Core Identity impersonate specific user
假设我有以下角色:
管理员
用户
我希望管理员角色以用户角色模拟特定用户帐户,但不知道该特定用户帐户的密码。
管理员应该能够从应用程序中模拟任何用户,并能够以用户本人的身份浏览应用程序。
I found a link 这实际上是在 ASP.NET MVC 4.6 中实现的,但是在将其转换为核心版本时有点头疼。
主要是因为link中的最后一行代码
authenticationManager.SignIn(new AuthenticationProperties()
{ IsPersistent = false }, impersonatedIdentity);
.NET Core 中的 SignIn
参数不再允许传递 IdentityResult
class (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
table 中找到的用户身份登录,该用户具有先前由 Admin 角色分配的角色和权限。老实说,我希望上面的代码至少以我在 var claims
中定义的名字和姓氏登录,但实际上,在我被重定向到索引页面后,我仍然以管理员帐户登录.
我需要采取哪些正确步骤才能以 AspNetUsers
table 中定义的用户帐户登录,以便管理员能够以用户本人的身份浏览应用程序?
在 Asp.Net 核心 HERE 中有一篇关于模拟的博客 post。我只是在寻找这样的解决方案,所以我还没有尝试实施它。但是,您似乎走在正确的轨道上。您的代码与 Max 的代码之间只有细微差别。
基本上你需要在浏览器端替换cookie。因此,对于下一个请求,服务器 "thinks" 是其他人登录的。至少到目前为止我是这么理解的。这就是为什么你最好把原来的身份也保存在cookie中,这样你就可以在需要的时候切换回原来的用户。
无论如何,当我有一个可行的解决方案时,我会回来。
假设我有以下角色:
管理员
用户
我希望管理员角色以用户角色模拟特定用户帐户,但不知道该特定用户帐户的密码。
管理员应该能够从应用程序中模拟任何用户,并能够以用户本人的身份浏览应用程序。 I found a link 这实际上是在 ASP.NET MVC 4.6 中实现的,但是在将其转换为核心版本时有点头疼。
主要是因为link中的最后一行代码
authenticationManager.SignIn(new AuthenticationProperties()
{ IsPersistent = false }, impersonatedIdentity);
.NET Core 中的 SignIn
参数不再允许传递 IdentityResult
class (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
table 中找到的用户身份登录,该用户具有先前由 Admin 角色分配的角色和权限。老实说,我希望上面的代码至少以我在 var claims
中定义的名字和姓氏登录,但实际上,在我被重定向到索引页面后,我仍然以管理员帐户登录.
我需要采取哪些正确步骤才能以 AspNetUsers
table 中定义的用户帐户登录,以便管理员能够以用户本人的身份浏览应用程序?
在 Asp.Net 核心 HERE 中有一篇关于模拟的博客 post。我只是在寻找这样的解决方案,所以我还没有尝试实施它。但是,您似乎走在正确的轨道上。您的代码与 Max 的代码之间只有细微差别。
基本上你需要在浏览器端替换cookie。因此,对于下一个请求,服务器 "thinks" 是其他人登录的。至少到目前为止我是这么理解的。这就是为什么你最好把原来的身份也保存在cookie中,这样你就可以在需要的时候切换回原来的用户。
无论如何,当我有一个可行的解决方案时,我会回来。