我有一个应用程序,它有多个子域 - 例如,portal.mysite.com,admin.mysite.com 等 - 它们都使用 auth.mysite.com,它运行IdentityServer 4。主站点将 React 与 oidc-client-js 一起使用,并且整个事情都是为隐式流设置的。当网站在子域之间转换时,我会在加载应用程序的其余部分之前调用oidcUserManager.signinSilent((,以确保用户已登录。
这一切都很好用。但是,注销不起作用。如果我从 www.mysite.com 注销然后返回 www.mysite.com,我就注销了。但是,如果我从 www.mysite.com 注销然后打开 portal.mysite.com,则静默身份验证成功。我调用注销:
const id_token_hint = user.id_token
oidcUserManager.signoutRedirect({ id_token_hint })
这正确地将我重定向到注销页面,在那里我添加了大量冗余调用:
var vm = await _account.BuildLoggedOutViewModelAsync(model.LogoutId);
await _signInManager.SignOutAsync();
await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme);
await HttpContext.SignOutAsync(IdentityServerConstants.DefaultCookieAuthenticationScheme);
await HttpContext.SignOutAsync();
我的理解是,如果IdentityServer使用的cookie被销毁,用户应该在所有内容中注销。由于浏览器安全性正常工作,我无法从浏览器存储中清除他们可能访问过的所有可能的子域中的 oidc 密钥。
我玩过cookie身份验证方案,但没有一个有什么不同。我已经手动删除了所有cookie,同样的问题。我还使用交互服务手动撤销会话的所有令牌,但我仍然可以正常登录。
我承认,我不完全了解后通道/前通道的东西,但我在这里试图解决的问题都在一个选项卡中 - 注销时应用程序未在浏览器中运行。我想可能是,但那是以后的事了!我认为?
关于如何将用户从所有子域中注销的任何建议?
我能够使用引用令牌来使用它,我可以完全撤销这些令牌,而不是我不能撤销的 JWT。随着我对这些规格的了解越来越多,这是我一开始就应该走的路!