【问题标题】:Sign out of all subdomains using IdentityServer 4使用 IdentityServer 4 注销所有子域
【发布时间】: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


    【解决方案1】:

    我能够使用我可以完全撤销的引用令牌来实现这一点,而我不能使用 JWT。随着我对这些规格的了解越来越多,我一开始就应该这样做!

    【讨论】:

    • 您能否详细说明您是如何解决此问题的?也许是一个样本?
    • 我没有完整的工作示例,但我将IIdentityServerInteractionService 注入到我的控制器中,除 _signInManager.SignOutAsync() 之外,注销方法还执行以下操作: await HttpContext.SignOutAsync(IdentityConstants .外部方案);等待 HttpContext.SignOutAsync(IdentityServerConstants.DefaultCookieAuthenticationScheme);等待 HttpContext.SignOutAsync(IdentityConstants.ApplicationScheme);等待 HttpContext.SignOutAsync();等待_interaction.RevokeTokensForCurrentSessionAsync();
    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 2017-12-03
    • 1970-01-01
    • 2011-07-01
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    相关资源
    最近更新 更多