是否可以将 IdentityServer4 中的用户作为不同的用户注销?

Is it possible to sign out a User in IdentityServer4 as a different user?

我想弄清楚的流程是这样的:

  1. 用户 A 正在登录客户端 A
  2. ClientA 重定向到身份服务器以验证用户
  3. 认证后ClientA在自己的系统中管理用户信息
  4. 用户 A 被发现是“不良行为者”
  5. AdminUser 进入 IdentityServer AdminTool(用于管理 IdentityServer 的不同客户端应用程序,包括用户)。
  6. AdminUser 执行“撤销”UserA 的操作
  7. 从管理工具调用 IdentityServer 后端,其中 UserA 的“已启用”属性 设置为 false。

在流程的这一点上,我想将用户从 IdentityServer 的后端踢出 ClientA。

更多背景信息: IdentityServer 在客户端浏览器中使用 cookie 来保持“会话”(不确定这是否是正确的词,因为实际上没有任何状态被管理)。 还使用 cookie 来记住我。

有没有办法从后端删除 IdentityServer 的 cookie?或者通知客户端 UserA 不应再具有有效的身份验证,以便它可以执行 HttpContext.SignOutAsync()?

我正在查看此 link:https://docs.identityserver.io/en/latest/topics/signout.html 以获取指导,但我仍然不知道如何以 AdminUser 的身份从后端执行此操作。调用 HttpContext.SignOutAsync() 会注销发出请求的 AdminUser,而不是在 ClientA 中造成严重破坏的 UserA。

在使用身份服务器的典型设置中,您有:

  • 生命周期短的 JWT 令牌
  • 会话 cookie

JWT 令牌需要经常更新。当没有有效的 JWT 时使用会话 cookie。在这种情况下,用户将被重定向到登录页面,如果有会话 cookie,用户将自动进行身份验证并重定向回客户端应用程序。

所以您有一些注销选项:

  • 确保用户无法更新他的 JWT(= 几分钟后注销)
  • 确保用户无法再次登录
  • 真正清除浏览器中的所有内容(并确保他不能再次login/renew)

回到你的问题

Is there a way to remove the cookie for the IdentityServer from the back-end?

这里的答案是允许双向通信的 WebSockets。

C# 的通用库是 Signal/R

您可以在服务器端创建一个 Hob,允许您向“不良用户”发送消息。

并在您的客户端应用程序中收听这些消息:

请注意:无论您在客户端做什么,重要的部分通常是阻止服务器请求。删除客户端上的 cookie 是不安全的。您必须改为在服务器端删除会话。

补充说明:

  • 您设置中的流程可能与我上面描述的不同。
  • 我知道,这只是部分回答,但内容太多,无法发表评论 ;-)