Angular Identity Server 4:在用户关闭浏览器/选项卡后,强制用户登录提供商

Angular Identity Server 4:在用户关闭浏览器/选项卡后,强制用户登录提供商,angular,asp.net-core,identityserver4,Angular,Asp.net Core,Identityserver4,我有一个Angular应用程序和一个ASP.NET核心web API,它们使用代码流客户端和带有Identity Server 4的PKCE流对用户进行身份验证(使用Facebook或Microsoft provider)。如果用户登录,访问令牌将成功地使用刷新令牌进行更新(静默刷新),因此用户可以在不中断的情况下工作 但是,如果用户没有注销,只是关闭浏览器或浏览器的选项卡;他再次访问该站点,当他单击“登录”时,他会自动登录,而不是要求提供商登录。因为cookie“idsrv”仍然有效。idsr

我有一个Angular应用程序和一个ASP.NET核心web API,它们使用代码流客户端和带有Identity Server 4的PKCE流对用户进行身份验证(使用Facebook或Microsoft provider)。如果用户登录,访问令牌将成功地使用刷新令牌进行更新(静默刷新),因此用户可以在不中断的情况下工作

但是,如果用户没有注销,只是关闭浏览器或浏览器的选项卡;他再次访问该站点,当他单击“登录”时,他会自动登录,而不是要求提供商登录。因为cookie“idsrv”仍然有效。idsrv cookie用于ASP.NET核心cookie身份验证

如果我明确地注销,它将正常工作,并且idsrv和idsrv会话cookie将被删除

我的问题是:如果用户关闭浏览器,我如何强制他再次登录,以确保下一个用户(例如在公用计算机上)不能使用他的凭据

编辑:我无法删除cookie客户端,因为它是一个仅限HTTP的cookie


结论:我已经发现了根本原因。实际上cookie没有什么问题:它是一个会话cookie,所以应该在浏览器关闭时删除它。然而,这并没有发生,因为我已经启用了浏览器设置“在您离开的地方继续”,所以它记住了打开的选项卡,包括cookie。我关闭了此功能,Cookie被很好地删除。

您需要首先从
'@angular/core'

使用
windowunload
事件,通过应用程序/根组件中的
HostListner
收听此事件

  @HostListener('window:unload', [ '$event' ])
  unloadHandler(event) {
        // write your remove token/userdetails logic here
        // e.g localStorage.removeItem('token');
  }

但是当你关闭窗口时,OnDestroy不会被调用,或者是吗?不,我正在调试我自己的答案,很快就会修改我的答案。现在每次选项卡/浏览器关闭事件都会被监听,并且可以在捕获事件时应用你的逻辑。谢谢,我确实在应用程序组件中尝试过这一点,但当我关闭浏览器时,似乎根本不会调用它。我正在调查可能出现的问题。啊,等等,它被称为,只是没有显示警报(“”)。我将尝试从此处删除cookie。是否尝试将cookie过期时间设置为“会话”?否,不确定如何在IdentityServer中配置该时间。您只需将cookie的过期时间设置为null,以便浏览器将其自动标记为会话cookie是的,它已经是会话cookie。请参阅我的编辑。请记住,许多web浏览器都有会话还原功能,可以保存所有选项卡,并在下次使用浏览器时还原它们。会话cookie也将被恢复,就像浏览器从未关闭一样。