ASP.NET Core Identity模拟特定用户

时间:2017-05-31 17:06:41

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

我们说我有以下角色:

  1. 管理

  2. 用户

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

    管理员应该能够模拟应用程序中的任何用户,并能够以用户自己的身份浏览应用程序。 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表中的用户那样实际登录,该用户具有以前由Admin角色分配的角色和权限。说实话,我期望上面的代码至少以var claims中定义的姓名和姓名登录,但实际上我在重定向到我之后仍然以管理员帐户登录索引页面。

    为了以AspNetUsers表中定义的用户帐户登录,我需要采取哪些正确的步骤,以便管理员能够以用户身份浏览应用程序?

1 个答案:

答案 0 :(得分:4)

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

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

无论如何,当我有一个有效的解决方案时,我会回来。