【问题标题】:IdentityServer4 - How to Implement ImpersonationIdentityServer4 - 如何实现模拟
【发布时间】:2018-01-14 22:21:50
【问题描述】:

我要求允许我们的内部支持用户冒充我们的客户用户。

我目前正在使用 IdentityServer4、隐式流和 OIDC 客户端。

目前找到的资源。

鉴于在线资源有限,我是否可以/应该如何使用 IdentityServer4 实现模拟?

【问题讨论】:

  • 如果有人知道如何实现这一点,只需我的 2 美分,但 IdentityServer4 服务器不能将其自身用作登录提供程序,因此就像您可以使用 gmail/facebook/ 进行身份验证一样等获取用户令牌,超级用户可以进行身份​​验证并获取用户令牌。
  • 有人问过类似的问题here

标签: asp.net-core impersonation identityserver4 oidc-client-js implicit-flow


【解决方案1】:

可能不会尝试在核心 IdentityServer4 库中构建模拟功能。你真的只需要一个小的数据结构来保存你的模拟 UserId 和一个服务来检查它。这是您的应用程序应该围绕它设计的基础特性。

另外请考虑,您可能需要即使您在模拟(例如取消模拟)时仍会显示自己的超级用户功能。

【讨论】:

  • 在经过身份验证的用户的声明中存储模拟用户的用户 ID 是否安全?
  • 我不认为这是不安全的,只是与身份验证系统无关,似乎更多的是应用程序的责任,其中模拟是一个功能
【解决方案2】:

怎么做

IdentityServer4 没有规定任何身份验证提供程序。它只是充当其他 OIDC 客户端的角色。这就是为什么您可以使用第三方登录提供商、本地帐户和其他任何东西。

在您的 IdentityServer 中创建一个 ImpersonationController。 请确保只有您的管理员才能访问此页面。

[Authorize(Policy = "CanImpersonate")]

构建一个页面,您可以在其中输入管理员想要模拟的用户 ID。 使用预期的用户 ID 发布该表单时,使用 SignInManager<> 类登录当前用户。

如果这对您很重要,您甚至可以构建一个下拉列表,说明您想模拟的外部登录提供商。 使用ExternalLoginSignInAsync 方法,否则使用普通的SignInAsync(user, false) 方法。

然后,您已在 Identity Server 上以该用户身份登录。当您的客户端应用程序请求登录时,IdentityServer 会注意到您的“伪造”会话,并会立即使用您当前登录的帐户重定向回客户端。

您现在在您的客户端应用程序和 IdentityServer 上模拟该用户。

如果您在 IdentityServer 上注销,您将再次“升级”到您之前登录的帐户(如果仍以不同身份登录),或者需要再次以您的实际管理员帐户登录。

注意事项

副作用

这显然是一个值得讨论的话题。我假设您要添加此功能,以便您可以重现用户问题,或以用户身份执行某些操作。

如果您在用户不知情的情况下执行此操作,请非常小心在模拟期间执行的任何操作的副作用。是否已发送电子邮件或类似通知。

走这条路会失去很多信任。

法律

这也是对隐私的关注。谁可以访问详细信息。在您的平台上冒充用户时会透露哪些详细信息。

推荐

不要冒充用户。

实施一种受控方式,让您的管理员可以执行所需的工作。这样您就有了一致的审核日志,无论登录用户对您的系统做什么,您都可以确定是该用户,而不是您的管理员冒充该帐户。

【讨论】:

    【解决方案3】:

    您可以实现 IResourceOwnerValidation 并以自己的方式验证您的支持用户。 例如为特定用户生成一个代码并将其提供给支持用户,然后在您的实现中也使用该代码检查您的密码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-22
      • 2017-07-07
      • 2018-07-19
      • 2015-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多