C# 允许支持者以其他用户身份登录

C# 允许支持者以其他用户身份登录,c#,asp.net-core,identityserver4,asp.net-core-identity,C#,Asp.net Core,Identityserver4,Asp.net Core Identity,我们目前有一个Identity server 4应用程序。使用实体框架核心和asp.net标识 我们有一群支持者,他们需要能够访问我们的用户帐户,以便通过电话帮助他们解决问题。我们的用户无法理解如何使用team viewer。因为他们中的大多数人都是移动的,那时只有一部手机 我知道允许其他人登录您的帐户的所有安全后果,但实际上没有办法解决。我们的客户已经接受我们的支持者可以在他们请求时连接到他们的帐户。我们相信,我们的支持者只有在其要求时才会这样做 当前解决方案及其问题 当前的黑客创建了一个ap

我们目前有一个Identity server 4应用程序。使用实体框架核心和asp.net标识

我们有一群支持者,他们需要能够访问我们的用户帐户,以便通过电话帮助他们解决问题。我们的用户无法理解如何使用team viewer。因为他们中的大多数人都是移动的,那时只有一部手机

我知道允许其他人登录您的帐户的所有安全后果,但实际上没有办法解决。我们的客户已经接受我们的支持者可以在他们请求时连接到他们的帐户。我们相信,我们的支持者只有在其要求时才会这样做

当前解决方案及其问题 当前的黑客创建了一个api端点,只有我们的支持者才能使用,因为它已经被锁定,只有那些拥有支持者权限的人才能使用它。他们向用户发送电子邮件,我们黑客为他们创建一个访问令牌,然后由应用程序(Web版本)使用该令牌来充当有问题的用户

这个解决方案是由我的前任创建的,基本上是通过获取支持者访问令牌,并将所有声明替换为用户id的支持者id,然后将其返回给应用程序。我在很多层面上都讨厌这个解决方案,而且每次我看到这个方法时,它都非常不稳定。目前它不起作用,因为出于某种原因,观众的沉默是不正确的

我想做什么 我真的很想用一种不那么粗鲁的方式来做这件事。那么,有没有一种方法可以让用户登录到应用程序,而不是让他们实际登录并返回访问令牌

我已经试过了

await _signInManager.SignInAsync(user, false, null);
但是我不知道如何让它返回访问令牌


我真正想做的是让支持者能够登录到任何一个帐户,但要以某种方式安全地登录。

用户帐户的问题是它没有绑定到一个应用程序。因此,通过允许其他人使用该帐户登录,您也为他们提供了访问其他应用程序的权限。作为一种解决方法,您可以使用“公共”帐户,如engineer_01、engineer_02等

但是,这可能根本没有必要。你真正想要的是模仿用户,而不是“黑客”帐户

一种方法是使用自定义授权类型扩展IdentityServer

这是如何工作的:

允许为特定客户端/资源模拟用户的已登录用户在新模拟端点处请求访问令牌

用户将
sub
从要模拟的用户发送到端点,在端点上验证用户和(组合)sub

当授予访问权限时,将返回一个新的(短期的)访问令牌,该令牌可用于模拟用户,而无需知道用户的凭据


访问令牌应包含端点的信息,以便确定是否模拟用户。

我们实现了一个模拟功能,该功能集成到基于浏览器的登录流中。如果具有权限的用户选择以另一用户身份登录,则我们将向其IDS4身份验证cookie添加其他声明,该cookie随后支持在生成的令牌中发出额外声明,以反映这是模拟会话以及原始参与者是谁

  • 导航到客户端应用程序
  • 使用任何凭据登录
  • 检查是否存在任何模拟权限(如何定义这些权限完全取决于您)
  • 提示选择模拟帐户(或仅以自身身份继续)
  • 以所选帐户登录(具有原始参与者的记录)
  • 重定向到授权终结点
  • 发出令牌并重定向回客户端应用程序

  • 请问您为什么不喜欢这个解决方案?我的意思是,如果它的编码正确,并且没有中断。我可以提供另一个解决方案,但我不知道你是否会发现它比你的前任已经尝试过的更干净。我只是觉得破解访问令牌很麻烦。我更愿意使用其他所有东西使用的签名流,让它为我正确地构建令牌,而不是感谢hacky。我的解决方案的一部分是也抛出签名流。这也将是一次黑客攻击。然而,Ruard提供的解决方案似乎比我要提出的要大得多。现在这正是我想要的。这一定是答案,因为主题是如何作为另一个用户登录,而不是如何使用不同的身份颁发不记名令牌。我现在要实现一些非常类似的东西。