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

时间:2020-01-09 15:18:44

标签: asp.net-core single-sign-on identityserver4

身份服务器和两个客户端(SSO):. Net Core MVC和Nodejs。

当我使用Nodejs客户端登录时,刷新MVC(第二个客户端)后,我获得了登录的MVC客户端。很好。 但是,当我从Nodejs注销时,它将向后通道注销URL发送到MVC客户端。 Nodejs的注销没有问题。但是MVC客户端-浏览器刷新后,它保持记录状态。 我阅读了thisthis的帖子,但它们没有帮助。

在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注销所有客户端吗?

1 个答案:

答案 0 :(得分:1)

在样本中,注销是使用注销页面上的iframe执行的。如果该页面被跳过或中止,则可能不会通知客户端。但我认为并非如此。

我宁愿选择不依赖iframe的更安全的后端注销。看看我的答案here为例。

现在关于客户。非JavaScript客户端确实需要往返来更新cookie。因此流程为:用户从客户端A注销。IdentityServer通知其他客户端(反向通道)并删除服务器cookie。

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

这就是缓存的来源。缓存仅包含来自服务器的警报。第一次,它将删除cookie,还将用户从缓存中删除。因此,缓存实际上将保持很小。请添加一些清除代码,以使用过期的Cookie删除注销的用户(从未返回)。