将 React.js 应用程序与 ... 库一起使用时,LogoutRequest 中没有 PostLogoutRedirectUri

LogoutRequest has no PostLogoutRedirectUri in it when using React.js app with ... library

我在 https://localhost:5443/ 有一个 Identity Server 4 实例 运行 和一个客户端 React.js 应用程序 运行在 http://localhost:3000/ 并参考 oidc-client library in order to establish the communication. I've been following more or less this 文章。

我在 Identity Server 上配置客户端(内存中)的方式如下:

new Client
                {
                    ClientId = "react-js-implicit-flow",
                    ClientName = "Some App name",
                    ClientUri = "http://localhost:3000",

                    AllowedGrantTypes = GrantTypes.Implicit,

                    RequireClientSecret = false,

                    RedirectUris = { "http://localhost:3000/signin-oidc", },
                    PostLogoutRedirectUris = { "http://localhost:3000/signout-oidc" },

                    AllowedCorsOrigins = { "http://localhost:3000" },

                    AllowedScopes = new List<string>
                    {
                        IdentityServerConstants.StandardScopes.OpenId,
                        IdentityServerConstants.StandardScopes.Profile,
                        "weatherapi.read"
                    },

                    AllowAccessTokensViaBrowser = true
                }

它在 Ract.js 应用程序上的样子是这样的:

总的来说,一切顺利。我可以从身份服务器登录和注销,但问题在于:

我没有得到任何值(它为空),这会阻止身份服务器在注销后立即将我重定向回客户端应用程序。如果我对其进行硬编码 (http://localhost:3000/signout-oidc),它就可以工作。但由于某种原因,它只是不可用。

注销期间,Identity Server 日志显示如下:

所以,没有错误,没有任何问题,但我在注销后仍然无法导航回客户端应用程序。

您没有为您的注销请求提供 idTokenHint(id 令牌),如下所示:

const mgr = new Oidc.UserManager(settings); 
const signoutUrl = await mgr.createSignoutRequest({id_token_hint: user.id_token});
window.location.href = signOutUrl.url;

//or
await mgr.signoutRedirect({id_token_hint: user.id_token});

//or just
await mgr.signoutRedirect();
//it will try to attach id_token internally

缺少令牌是 Identityserver 跳过 post_logout_redirect_url 参数的原因。
Identityserver 必须根据客户端的配置验证参数,但如果没有令牌,它就不能。

解决问题的方法(我感谢 @d_f 的回答)是在客户端更改某些内容,更具体地说:src/services/userService/signoutRedirect .