我有一个具有多个子域的应用程序-例如,portal.mysite.com,admin.mysite.com等-它们都使用运行IdentityServer 4的auth.mysite.com。使用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,这是同样的问题。我还使用了交互服务来手动撤销会话的所有令牌,但仍然可以正常登录。
我承认,我不完全了解后频道/前频道的内容,但是我要在此处解决的问题都在一个标签内-日志记录时该应用程序未在浏览器中运行出来。我想可能是这样,但这是以后的事!我想吗?
关于如何将用户从所有子域中注销的任何建议?
答案 0 :(得分:0)
我能够使用参考令牌来工作,而我不能完全撤销参考令牌,而我可以完全撤销参考令牌。随着我对这些规格的了解越来越多,这就是我应该首先使用的方式!