我有一个要求,允许我们的内部支持用户模拟我们的客户用户。
我目前正在使用IdentityServer4、隐式流和OIDC客户端。
到目前为止发现的资源。
鉴于在线资源有限,对于如何使用IdentityServer4实现模拟,有什么建议吗?
发布于 2020-02-19 17:50:10
如何做到这一点
IdentityServer4没有指定任何身份验证提供程序。它只是作为一个本身为其他OIDC客户端。这就是为什么你可以使用第三方登录提供者,本地帐户和其他任何东西。
在您的ImpersonationController中创建一个IdentityServer。确保只有管理员才能访问此页面。
[Authorize(Policy = "CanImpersonate")]构建一个管理员想要模拟的页面,您可以在其中输入一个用户ID。当使用预期的用户ID发布该表单时,请使用SignInManager<>类在当前用户中签名。
您甚至可以构建一个下拉列表,如果这对您很重要,那么您想要模拟的外部登录提供程序。使用ExternalLoginSignInAsync方法,否则使用普通的SignInAsync(user, false)方法。
然后,您已经在Identity Server上注册为该用户。当您的客户端应用程序请求登录时,IdentityServer将注意到您的“伪造”会话,并将重新定向回客户端,立即使用您当前已签名的帐户。
您现在正在客户端应用程序和IdentityServer上模拟该用户。
如果您在SignOut on IdentityServer上,您将再次“升级”到您以前登录的帐户(如果仍然以不同的身份登录),或者需要再次以实际管理员帐户的身份登录。
你需要小心的东西
副作用
这显然是一个值得辩论的话题。我假设您想要添加这个特性,这样您就可以复制用户问题,或者作为用户执行一些操作。
如果您在用户不知道的情况下执行此操作,请非常小心在模拟过程中所做的任何操作的副作用。是发电子邮件还是类似的通知。
沿着这条路走下去会失去很多人的信任。
法
这也是对隐私的关注。谁能接触到细节。在您的平台上冒充用户时,会披露哪些细节。
一项建议
不要冒充用户。
实现一种受控的方式,您的管理员可以在其中执行所需的工作。然后,您有一个一致的审计日志,无论用户登录到您的系统中做什么,您都可以确定是该用户,而不是您的管理员冒充该帐户。
发布于 2017-08-07 19:36:24
可能不会尝试将模拟特性构建到核心IdentityServer4库中。您确实需要一个小的数据结构来保存您模拟的UserId,并需要一个服务来检查它。这是一个基础功能,您的应用程序应该围绕。
另外,您可能需要超级用户特性,即使您是在冒充(例如,非模拟的),但它们仍然存在。
发布于 2020-02-25 11:31:56
您可以以自己的方式实现IResourceOwnerValidation并验证您的支持用户。例如,为特定用户生成代码并将其提供给支持用户,然后在实现中也使用该代码检查您的密码。
https://stackoverflow.com/questions/45549824
复制相似问题