【问题标题】:ASP.NET Core Identity impersonate specific userASP.NET Core Identity 模拟特定用户
【发布时间】:2017-11-01 14:47:06
【问题描述】:

假设我有以下角色:

  1. 管理员

  2. 用户

我希望管理员角色模拟具有用户角色的特定用户帐户,但不知道该特定用户帐户的密码。

管理员应该能够模拟应用程序中的任何用户,并能够以用户自己的身份浏览应用程序。 I found a link 这实际上是在 ASP.NET MVC 4.6 中实现的,但是在将其转换为 Core 版本时有点头疼。

主要是因为链接的最后一行代码

authenticationManager.SignIn(new AuthenticationProperties() 
{ IsPersistent = false }, impersonatedIdentity);

.NET Core 中的 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 表中定义的用户帐户登录,以便管理员能够以用户本人身份浏览应用程序?

【问题讨论】:

  • 首先,在实现此类功能时要非常小心,因为它可能会让您承担法律责任,尤其是在您处理信用卡信息或健康信息时。其次,您需要提供一些表明用户被冒充的审计功能,以便证明是否是被冒充用户的真实用户做了某事。
  • 感谢您的建议,但我们已经与客户达成协议,请不要担心。有什么想法/方法可以解决这里的问题吗?
  • 您是否尝试过这里的解决方案:stackoverflow.com/a/42059249/61164 - 请注意,这里使用的是 SigninManager,而不是 AuthenticationManager。
  • 谢谢,我去看看。

标签: c# impersonation claims-based-identity asp.net-core-1.1 asp.net-core-identity


【解决方案1】:

在 Asp.Net Core HERE 中有一篇关于模拟的博文。我只是在寻找这样的解决方案,所以我还没有尝试实现它。但是,您似乎走在正确的轨道上。您的代码和 Max 的代码只有细微差别。

基本上你需要在浏览器端替换cookie。因此,对于下一个请求,服务器“认为”它是其他人登录的。至少到目前为止我是这么理解的。这就是为什么您最好将原始身份也保存在 cookie 中,以便在需要时切换回原始用户。

当我有一个可行的解决方案时,我会回来。

【讨论】:

  • 进展如何?介意解释一下博客链接吗?
猜你喜欢
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
  • 2015-04-07
  • 1970-01-01
  • 2021-01-10
  • 2018-10-25
  • 2016-12-09
  • 2020-06-19
相关资源
最近更新 更多