注销流程中的 PostLogoutRedirectUris 和 Signout-callback-oidc 是什么

Tri*_*Tri 3 identityserver4

PostLogoutRedirectUris = { "https://yourclienthost:port/signout-callback-oidc" } 请问客户端配置的目的是什么 ?

当我放置它时,IdentityServer 注销页面显示确认的注销消息显示重定向回我的应用程序的链接。 在此输入图像描述

当我省略它时,IdentityServer 显示确认的注销消息,但不显示重定向回我的应用程序的链接 在此输入图像描述

无论选择什么,IdentityServer仍然将我注销。所以我很困惑该配置的作用。请帮忙澄清一下。非常感谢!

idi*_*lov 9

客户端配置中 PostLogoutRedirectUris 的目的是安全。

当客户端发起注销时,客户端会打开如下 URL:

  1. https://[身份服务器]/connect/endsession?post_logout_redirect_uri= https%3A%2F%2Fclient%2Fapp%2Fsignout-callback-oidc &id_token_hint=XXX&state=YYY&...

请注意,客户端本身告诉 IdentityServer 在注销后重定向到哪里。这意味着客户端可能会欺骗 IdentityServer 以重定向到恶意 URI。这就是为什么在 IdentityServer 端使用 URI 白名单,称为PostLogoutRedirectUris. 该列表包含客户端所有可能的部署位置,例如

"PostLogoutRedirectUris": [
    "https://localhost:44321/signout-callback-oidc",
    "https://client/app/signout-callback-oidc", ...
]
Run Code Online (Sandbox Code Playgroud)

当客户端建议的回调URI不在白名单中时,则

IdentityServer 显示确认的注销消息,但不显示重定向回您的应用程序的链接

注销过程继续如下:

  1. .../connect/endsession 上面重定向到https://[identity-server]/Account/Logout?logoutId=ZZZ
  2. 注销操作呈现一个页面,其中包含返回客户端的链接 ( https://client/app/signout-callback-oidc&id_token_hint=XXX&state=YYY&...)
  3. 在同一页面上还有一个打开的 iframehttps://[identity-server]/connect/endsession/callback?endSessionId=TTT
  4. 该 iframe 呈现另一个 iframe,该 iframe 通过调用注销客户端https://client/app/signout-oidc?sid=SSS&iss=https://identity-server
  5. 在同一页面上还有一些 JavaScript,它会自动打开步骤 3 中的链接并返回到您的客户端应用程序。
  6. MVC 客户端中的路由/signout-callback-oidc不执行任何操作(可能;我不知道它做了什么),但它重定向到主页。(*)

IdentityServer 和客户端应用程序的注销已在步骤 5 中完成/signout-callback-oidc与注销本身无关。它仅在客户端应用程序中提供一个登录页面,以便用户不会卡在 IdentityServer 中的页面上。

(*) 更准确地说,/signout-callback-oidc在客户端应用程序中重定向到options.SignedOutRedirectUri可以在 期间设置的位置AddOpenIdConnect()。默认情况下SignedOutRedirectUri == "/"。我更喜欢将该选项更改为"/Account/Login". 这样我在注销后就可以看到登录页面。

"/signout-callback-oidc"只是 的默认值options.SignedOutCallbackPath。您可以更改该路径,但没有任何好处。该路由由中间件自动注册并自动处理。您不能为该路线编写自己的控制器/操作。