c# - ASP.NET Core Identity 模拟特定用户

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

假设我有以下角色:

  • 管理员
  • 用户

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

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

    主要是因为链接中的最后一行代码
    authenticationManager.SignIn(new AuthenticationProperties() 
    { IsPersistent = false }, impersonatedIdentity);
    

    哪里SignIn .NET Core 中的参数不允许 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 中定义的用户帐户身份登录表,以便管理员能够以用户自己的身份浏览应用程序?

    最佳答案

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

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

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

    关于c# - ASP.NET Core Identity 模拟特定用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44290827/

    相关文章:

    c# - 输入字符串的格式不正确 #2

    c# - Windows 模拟 LogonUser 错误

    c# - 无法添加和获取自定义声明值

    laravel - 如何在 laravel 4 应用程序中模拟任何用户

    google-cloud-platform - 获取谷歌服务帐户的 signedJwt token

    google-chrome - 在开发人员中运行时未在 Google Chrome 中设置 ASP.net 核心身份验证 cookie

    claims-based-identity - 使用 Web 应用程序代理时 ADFS 3.0 错误事件 ID 511 和 364

    C# 在字符串数组列表中查找元素

    c# - 多线程 WPF Application : Dispatcher Invoke. 更高效的方法?

    c# - 如何对多个实例使用 Using 语句?