使用 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。
此时,我使用msal
的logoutRedirect
方法。
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 的身份代理授予客户端凭据
Hashicorp Vault OIDC 身份验证方法与 Azure AD 错误验证签名