【问题标题】:Identity Server 4 External IDP Signout TidyupIdentity Server 4 外部 IDP 注销整理
【发布时间】:2019-01-03 05:48:29
【问题描述】:

我的 Identity Server 4 运行正常,为 MVC 应用程序执行本地身份验证工作正常。我还需要添加对外部 IDP 的支持,因此我按照文档中的说明进行操作,并以快速入门代码为基础。因此,它当前配置为使用https://demo.identityserver.io 的演示 IDP 作为外部 IDP,并且可以正常登录 - 用户被重定向到外部 IDP 以输入他们的详细信息,我的身份验证服务器返回一个带有用户 ID(主题)的 id_token我匹配我们自己的用户存储库中的用户。然后我们的身份验证服务器按照正常情况继续登录,发出自己的令牌等 - 到目前为止一切都很好。

我遇到的问题是从外部 IDP 注销 - 如果用户直接从 demo.identityservier.io IDP 注销,我需要确保此过滤器返回以清除存储的身份验证 cookie,从而要求用户如果他们尝试访问应用中受保护的页面,请重新登录。

如果用户从我们自己的 ID 服务器注销(即 ID 服务器显示的注销页面具有确保 MVC 应用程序得到整理的内置 iframe),这可以正常工作。对于外部 IDP,我会期待类似的事情,但看不到任何东西。

这是在我们的本地 IDP 启动中注册外部 IDP 的启动配置。

        .AddOpenIdConnect("Ext_oidc", "Ext OpenID Connect", options =>
        {
            options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
            options.SignOutScheme = IdentityServerConstants.SignoutScheme;
            options.Authority = "https://demo.identityserver.io/";
            options.ClientId = "implicit";
            options.ResponseType = "id_token";
            options.TokenValidationParameters = new TokenValidationParameters
            {
                NameClaimType = "name",
                RoleClaimType = "role"
            };
        });

任何建议都将受到欢迎

【问题讨论】:

    标签: single-sign-on openid identityserver4 openid-connect


    【解决方案1】:

    您是否向外部 IDP 提供了结束会话端点 URL?如果它已定义,我希望它作为外部 IDP 上显式注销过程的一部分被调用。

    【讨论】:

    • 原始帖子中的代码 sn-p 是我到目前为止添加的全部内容,但是在调试中查看身份验证选项还为 RemoteSignOutPath 和 SignedOutCallbackPath 设置了默认值,即 /signout-oidc 和 /signout-回调-oidc 分别。阅读有关联合注销的 Identity Server 4 文档,似乎表明所有这些都是开箱即用的。 docs.identityserver.io/en/release/topics/signout_federated.html
    • 远程 IDP 的客户端配置仍然需要知道您的客户端 IDP 的结束会话端点 - 否则它无法进行呼叫。
    • 啊,你是对的@mackie,演示 idsrv 不会知道这一点,因此我什么也得不到。你为我指明了正确的方向。我托管了我自己的 id 服务器 (B) 的第二个副本,并为 ID 服务器 (A) 配置了一个客户端以用作外部 IDP。然后将此附加信息添加到 ID 服务器 (A) options.CallbackPath = "/signin-Ext_oidc"; options.SignedOutCallbackPath = "/signout-callback-Ext_oidc"; options.RemoteSignOutPath = "/signoutExt_oidc"; 中的 OIDC 设置中,然后就可以正常工作了。
    【解决方案2】:

    在您的 MVC 应用程序中,在操作中使用以下代码并调用它以注销并清除应用程序 cookie 和 ID 服务器 cookie。

    Request.GetOwinContext().Authentication.SignOut(Request.GetOwinContext().Authentication.GetAuthenticationTypes()
                .Select(o => o.AuthenticationType).ToArray());
    

    【讨论】:

    • 它是一个外部 IDP - 我无权访问代码!另外,我正在针对官方测试身份服务器 4 进行测试,所以我会假设创建者已经正确实现了它?
    • 您需要在您的 MVC 应用程序中实现注销功能以从外部 IDP 和您的 MVC 应用程序注销,检查更新的答案。
    • 我已经在客户端配置中定义了一个前通道注销 url - 如果我只使用本地 IDP 登录然后从身份服务器注销,则调用 MVC 应用程序回调并正确清除会话向上。同样,如果我通过 MVC 应用程序本身发起注销,那么会话和 IDP 都会被注销。当涉及到外部 IDP 时会出现问题 - 如果我先在那里签名,那么本地 IDP 和 MVC 应用程序都将处于高空状态,没有任何通知。
    猜你喜欢
    • 2018-11-09
    • 2021-03-14
    • 2020-10-06
    • 1970-01-01
    • 2020-04-10
    • 2019-07-02
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    相关资源
    最近更新 更多