Open Id/OAuth2.0 注销中的 PostLogoutRedirectUri 有何意义?

问题描述

我一直使用 Identity Server 4.0 作为我的 OpenId Connect 提供者。我可以使用重定向 Uris 和注销后重定向 Uris 在 Identity Server 中设置客户端。我也一直在使用 angular-auth-oidc-client 通过身份服务器登录/注销。

登录时,我的客户端库 (angular-auth-oidc-client) 在调用授权端点时会传入配置中指定的正确 Uri。当我尝试使用不正确的重定向 Uri 登录时,Identity Server 会检查并验证客户端提供的 Uri 是该客户端可接受的 Uri 之一,如果不是(如预期的那样),则显示错误

说到注销,似乎没有内置。我的客户端库在调用注销端点时不发送 PostlogoutRedirectUri。 Identity Server 用于注销的示例代码除了要传入的任何 URI 之外并没有。它的示例代码只是从数据库获取 Post logout Redirect Uri 值并在注销页面上创建一个链接。示例代码不仅不允许用户为注销指定重定向 Uri,而且它不进行任何检查,甚至不进行重定向(授予其唯一的示例代码,我可以更改它)。我希望我的客户端库传递 Uri,并且身份服务器在成功注销后重定向到 Uri,只要它是客户端的“批准”Uri 之一。

我的问题是: PostlogoutRedirectUri 的意义何在?我使用的 Identity Server 和 OIDC 客户端库都没有对它做任何有用的事情。对于用于将此 Uri 传递给 Identity Server 的查询字符串参数的名称,似乎甚至没有达成一致的约定。然而,身份服务器和 angular 客户端库似乎都支持它。那么这件事有什么意义呢?是否会在以后添加或充实?我是否错过了一些描述其用途和使用方法的文档?

解决方法

这是一个标准草案,图书馆和供应商之间的支持不同,但这里是一个总结:

  • 客户端使用注销后重定向 URI 以受控方式注销,通常重定向到为用户提供再次登录链接的应用程序页面

  • 一个客户端可能有多个 post_logout_redirect_uri 并根据运行时条件决定使用哪个

  • 发送的 post_logout_redirect_uri 仅在伴随 id_token_hint 并且与针对 OAuth 客户端的配置值匹配时才会被接受。我相信 OIDC 会发送当前的 id 令牌,但值得检查这是否在您的浏览器工具中发生。

  • 如果没有发送 post_logout_redirect_uri,那么授权服务器可能会使用默认配置的

请参阅 official IETF docs 了解其工作原理。

,

在我自己的应用程序中,我将其设置为客户端的/Signout-callback-oidc URL,例如

PostLogoutRedirectUris = { "https://localhost:5001/signout-callback-oidc" },

/signout-callback-oidc 路径在源代码中定义为here

/// <summary>
/// The request path within the application's base path where the user agent will be returned after sign out from the identity provider.
/// See post_logout_redirect_uri from http://openid.net/specs/openid-connect-session-1_0.html#RedirectionAfterLogout.
/// </summary>
public PathString SignedOutCallbackPath { get; set; }

我希望这可以给一些澄清。