怎么做
IdentityServer4 没有规定任何身份验证提供程序。它只是充当其他 OIDC 客户端的角色。这就是为什么您可以使用第三方登录提供商、本地帐户和其他任何东西。
在您的 IdentityServer 中创建一个 ImpersonationController。
请确保只有您的管理员才能访问此页面。
[Authorize(Policy = "CanImpersonate")]
构建一个页面,您可以在其中输入管理员想要模拟的用户 ID。
使用预期的用户 ID 发布该表单时,使用 SignInManager<> 类登录当前用户。
如果这对您很重要,您甚至可以构建一个下拉列表,说明您想模拟的外部登录提供商。
使用ExternalLoginSignInAsync 方法,否则使用普通的SignInAsync(user, false) 方法。
然后,您已在 Identity Server 上以该用户身份登录。当您的客户端应用程序请求登录时,IdentityServer 会注意到您的“伪造”会话,并会立即使用您当前登录的帐户重定向回客户端。
您现在在您的客户端应用程序和 IdentityServer 上模拟该用户。
如果您在 IdentityServer 上注销,您将再次“升级”到您之前登录的帐户(如果仍以不同身份登录),或者需要再次以您的实际管理员帐户登录。
注意事项
副作用
这显然是一个值得讨论的话题。我假设您要添加此功能,以便您可以重现用户问题,或以用户身份执行某些操作。
如果您在用户不知情的情况下执行此操作,请非常小心在模拟期间执行的任何操作的副作用。是否已发送电子邮件或类似通知。
走这条路会失去很多信任。
法律
这也是对隐私的关注。谁可以访问详细信息。在您的平台上冒充用户时会透露哪些详细信息。
推荐
不要冒充用户。
实施一种受控方式,让您的管理员可以执行所需的工作。这样您就有了一致的审核日志,无论登录用户对您的系统做什么,您都可以确定是该用户,而不是您的管理员冒充该帐户。