使用 Azure AD 作为身份提供者的 Azure ADB2C 单点注销

Azure ADB2C Single Sign Out W/ Azure AD as Identity Provider

我有一个使用 msal 的 React SPA。我已将 Azure AD 配置为我的 AADB2C 的身份提供者。我可以signIn/signOut等操作

如果我的用户注销我的应用程序,我也想注销我的身份提供者。我调查了一下这件事 1, 2, 3, 4, 5.

此时我使用msallogoutRedirect方法

const url = new URL(AadEndSessionEndpoint);
url.searchParams.append('post_logout_redirect_uri', SPAUrl);
instance.logoutRedirect({
  postLogoutRedirectUri: url.toString()
});

发生了什么,在我的用户退出我的 AADB2C 后,他被重定向到 AAD end_session_endpoint。我也可以在那里注销,但我的用户被困在那里。即使我传递 post_logout_redirect_uri 查询参数返回我的应用程序,它也会忽略它。

我怎样才能完成这项工作?

您正在执行 OpenID Connect 术语中的 RP Initiated Logout,这意味着您还需要发送 id_token_hint 查询参数。

我还可以确认发送两个查询字符串参数已成功注销我的 Azure 开发人员帐户:

url.searchParams.append('post_logout_redirect_uri', SPAUrl);
url.searchParams.append('id_token_hint', myIdToken);

我认为 MSAL 库要求您改用 getAccount

const account = msalInstance.getAccount();
await msalInstance.logoutRedirect({
    account,
    postLogoutRedirectUri: "https://contoso.com/loggedOut"
});

更新

您上面的代码不正确 - post 注销重定向 URI 应该是您自己的应用程序的 URI - 我希望库已经知道结束会话端点位置 - 所以只需这样做:

instance.logoutRedirect({
  postLogoutRedirectUri: SPAUrl
});

同时值得注意的是,基于 GET URL 的完整标准应该如下所示。了解预期的 URL 您可以检查您是否通过浏览器工具发送了正确的请求:

https://[AadEndSessionEndpoint]?id_token_hint=[myIdToken]&post_logout_redirect_uri=[SPAUrl]

顺便说一下,结束会话端点应该是这样的值: