0

比方说,我有以下作用:ASP.NET核心身份冒充特定的用户

  1. 联系

  2. 用户

我想管理员角色模仿与特定的用户帐户用户角色,但不知道特定用户帐户的密码。

管理员应该能够模拟应用程序中的任何用户,并能够以用户自己的身份浏览应用程序。 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能够以用户自己的身份浏览应用程序?

+0

首先,非常小心地实施这种功能,因为它可能会使您承担法律责任,尤其是在您处理信用卡信息或健康信息时。其次,您需要提供一些审计功能,指示用户已被模拟,以便可以证明它是否是模拟用户的真正用户做了某事。 –

+0

感谢您的建议,但我们已经与客户达成了协议,请不要担心。任何想法/方法来解决这个问题? – pavilion

+1

你有没有尝试过这里的解决方案:https://stackoverflow.com/a/42059249/61164 - 请注意,这使用SigninManager,而不是AuthenticationManager。 –

回答

0

在Asp.Net Core HERE有一篇关于冒充的博客文章。我只是在寻找这样的解决方案,所以我还没有尝试过实施它。不过看起来你正走在正确的轨道上。你的代码和Max的代码只有细微的差别。

基本上你需要在浏览器端替换cookie。因此,对于下一个请求,服务器“认为”其他人登录。至少这是我迄今为止所了解的。这就是为什么您更好地将原始身份保存在Cookie中的原因,因此您可以在需要时切换回原始用户。

无论如何,当我有工作解决方案时,我会回来。

相关问题