如何从 Identity Server 注销所有客户端?

How to logout all clients from Identity Server?

Identity Server 和两个客户端 (SSO):.Net Core MVC 和 Nodejs。

当我使用 Nodejs 客户端登录时,刷新 MVC(第二个客户端)后,我获得了已登录的 MVC 客户端。很好。 但是当我从 Nodejs 注销时,它会向 MVC 客户端发送反向通道注销 url。 Nodejs 没有注销问题。但是 MVC 客户端 - 在浏览器刷新后它会保持记录状态。 我阅读了 and 篇文章,但没有帮助。

在 MVC 启动时我写了这段代码:

options.Events = new OpenIdConnectEvents
{
OnTicketReceived = (e) =>
 {
  e.Properties.IsPersistent = true;
  e.Properties.ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(2);

  return Task.CompletedTask;
}
};

两分钟后,我刷新浏览器,MVC 重定向到 Idrsv 登录页面。它很好,但不安全(需要等待 2 分钟)。

我读到 userId claim cache,但我怀疑 - 如果有很多活动会话,那么缓存会非常大,应用程序会运行缓慢。

我可以使用前端通道注销,但我读到了缺点,现在我怀疑了。

从 Identity Server 注销所有客户端,您更喜欢什么?

在示例中,注销是在注销页面上使用 iframe 执行的。如果跳过或中止此页面,可能不会通知客户。但我不这么认为。

我更喜欢不依赖 iframe 的更安全的后端注销。看看我的回答 作为例子。

现在谈谈客户。非 javascript 客户端确实需要往返更新 cookie。所以流程是:用户从客户端 A 注销。IdentityServer 通知其他客户端(反向通道)并删除服务器 cookie。

现在(非javascript)客户必须采取行动。它还需要删除 cookie,但这只能在 用户执行操作后

这就是缓存的用武之地。缓存仅包含来自服务器的警报。在第一次机会时,它会删除 cookie 并将用户从缓存中删除。所以缓存实际上会保持很小。请添加一些清理代码以删除使用过期 cookie 的已注销用户(从未返回)。