【发布时间】:2019-01-16 00:05:04
【问题描述】:
我有一个具有多个子域的应用程序 - 例如,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 身份验证方案,但没有任何区别。我已经手动删除了所有的cookies,同样的问题。我还使用交互服务手动撤销了会话的所有令牌,我仍然可以正常登录。
我承认,我并不完全了解后置通道/前置通道的内容,但我试图在这里解决的问题都在一个选项卡中 - 登录时应用程序未在浏览器中运行出去。我想可能是,但那是以后的事了!我想?
关于如何让用户退出所有子域的任何建议?
【问题讨论】:
标签: asp.net-core asp.net-identity identityserver4 openid-connect