Asp.net core 如何从Identity Server注销所有客户端?

Asp.net core 如何从Identity Server注销所有客户端?,asp.net-core,single-sign-on,identityserver4,Asp.net Core,Single Sign On,Identityserver4,Identity Server和两个客户端SSO:.Net核心MVC和Nodejs 当我使用Nodejs客户端登录时,在刷新MVC第二个客户端之后,我得到了已登录的MVC客户端。很好。 但当我从Nodejs注销时,它会将通道注销url发送回MVC客户端。Nodejs在注销时没有问题。但是MVC客户端-在浏览器刷新后,它将保持记录状态。 我读了很多文章,但都没用 在MVC启动时,我编写了以下代码: options.Events = new OpenIdConnectEvents { OnTicke

Identity Server和两个客户端SSO:.Net核心MVC和Nodejs

当我使用Nodejs客户端登录时,在刷新MVC第二个客户端之后,我得到了已登录的MVC客户端。很好。 但当我从Nodejs注销时,它会将通道注销url发送回MVC客户端。Nodejs在注销时没有问题。但是MVC客户端-在浏览器刷新后,它将保持记录状态。 我读了很多文章,但都没用

在MVC启动时,我编写了以下代码:

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

  return Task.CompletedTask;
}
};
两分钟后,我刷新浏览器并将MVC重定向到Idrsv登录页面。它很好,但不安全,需要等待2分钟

我读过,但我怀疑——如果会有很多活动会话,那么缓存将非常大,应用程序将运行缓慢

我可以用前频道注销,但我读到了关于犯人的消息,现在我怀疑了


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

在示例中,使用注销页面上的iFrame执行注销。如果跳过或中止此页面,则可能不会通知客户端。但我认为情况并非如此

我更喜欢不依赖iFrame的更安全的后端注销。以我的答案为例

现在谈谈客户。非javascript客户端确实需要一次往返来更新cookie。因此,流程是:用户从客户端A注销。IdentityServer通过反向通道通知其他客户端并删除服务器cookie

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

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