是否可以将 IdentityServer4 中的用户注销为其他用户?

Posted

技术标签:

【中文标题】是否可以将 IdentityServer4 中的用户注销为其他用户?【英文标题】:Is it possible to sign out a User in IdentityServer4 as a different user? 【发布时间】:2021-12-30 14:22:30 【问题描述】:

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

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

此时,我想将用户从 IdentityServer 的后端踢出 ClientA。

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

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

我正在查看此链接:https://docs.identityserver.io/en/latest/topics/signout.html 以获得指导,但我被困在如何以 AdminUser 身份从后端执行此操作。调用 HttpContext.SignOutAsync() 将注销发出请求的 AdminUser,而不是在 ClientA 中导致破坏的 UserA。

【问题讨论】:

请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。 【参考方案1】:

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

寿命短的 JWT 令牌 会话 cookie

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

所以你有一些退出选项:

确保用户无法续订其 JWT(= 几分钟后注销) 确保用户无法再次登录 真正清除浏览器中的所有内容(并确保他无法再次登录/续订)

回到你的问题

有没有办法从后端删除 IdentityServer 的 cookie?

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

https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API

C# 的常用库是 Signal/R

https://dotnet.microsoft.com/apps/aspnet/signalr

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

https://docs.microsoft.com/en-us/aspnet/core/signalr/hubs?view=aspnetcore-6.0

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

https://docs.microsoft.com/en-us/aspnet/core/signalr/javascript-client?view=aspnetcore-6.0

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

补充说明:

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

【讨论】:

以上是关于是否可以将 IdentityServer4 中的用户注销为其他用户?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法撤销另一个用户的访问令牌并结束他们在 Identity Server 4 中的会话?

IdentityServer4 中的 CSRF 保护

如何将 IdentityServer4 设置为外部身份提供者

IdentityServer4服务器配置

如何通过自省验证 IdentityServer4 访问令牌

Blazor 客户端中的 Identityserver4 未授权 api