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

Posted

技术标签:

【中文标题】使用 Azure AD 作为身份提供者的 Azure ADB2C 单点注销【英文标题】:Azure ADB2C Single Sign Out W/ Azure AD as Identity Provider 【发布时间】:2021-11-12 06:46:11 【问题描述】:

我有一个使用 msal 的 React SPA。我已将 Azure AD 配置为我的 AADB2C 的身份提供程序。我可以登录/签出等操作。

如果我的用户退出我的应用程序,我也想退出我的身份提供程序。我对此事进行了一些调查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 查询参数传递回我的应用程序,它也会忽略它。

我怎样才能做到这一点?

【问题讨论】:

【参考方案1】:

在 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"
);

更新

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

instance.logoutRedirect(
  postLogoutRedirectUri: SPAUrl
);

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

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

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

https://login.microsoftonline.com/7f071fbc-8bf2-4e61-bb48-dabd8e2f5b5a/oauth2/v2.0/logout

【讨论】:

我对此进行了调查,但我无法找到从msal 中取出id_token_hint 的方法。 试试上面的 getAccount 选项 - 有兴趣看看它是否有效...... 好吧,现在我有点糊涂了。所以我需要编辑我的问题。问题是我正在做您在第二个示例中显示的内容(如果您不指定帐户,我认为它会获得活动帐户,或者来自getAccounts() 的第一个帐户)。问题是,我想退出我的身份提供者,在这种情况下是 AAD。我尝试的方法是我将一个 URL 作为 post_logout_redirect_uri 传递给我的 AAD,在第二个 URL 中我有另一个 post_logout_redirect_uri。可能我没有做对,但根据我所读到的,我需要在两个地方注销。

以上是关于使用 Azure AD 作为身份提供者的 Azure ADB2C 单点注销的主要内容,如果未能解决你的问题,请参考以下文章

使用 Keycloak 作为 Azure AD 的身份代理授予客户端凭据

使用 Azure AD B2C 作为服务进行身份验证

Hashicorp Vault OIDC 身份验证方法与 Azure AD 错误验证签名

Azure AD 身份提供程序中的 VSO 范围

为 Azure AD B2C 自定义策略调用 New-CpimCertificate 时出现问题

如何搭建一套Azure AD与ADFS集成身份的环境