刷新令牌后 Azure AD B2C 访问令牌声明不会更新

Azure AD B2C Access token claims do not update after refreshing token

我们在我们的应用程序中使用 Azure AD B2C。 我们授权用户使用 API

https://{tenant}.b2clogin.com/{tenant}.onmicrosoft.com/{policy}/oauth2/v2.0/authorize?client_id=<client-id-uuid>
&nonce=defaultNonce&redirect_uri=http%3A%2F%2Flocalhost%3A4200%2Findex.html
&scope=openid%20offline_access%20https%3A%2F%2F{tenant}.onmicrosoft.com%2F<client-id-uuid>%2FUser.all
&response_type=code&prompt=login

使用上面我们获取 authorization_code.

此授权代码用于通过应用程序对用户进行身份验证,并使用

获取 access_tokenrefresh_tokenid_token
POST /{tenant}.onmicrosoft.com/{policy}/oauth2/v2.0/token HTTP/1.1
Host: {tenant}.b2clogin.com
Content-Type: application/x-www-form-urlencoded
Cache-Control: no-cache

grant_type=authorization_code&code={auth code received in previous step}
&scope=openid%20offline_access%20https%3A%2F%2F{tenant}.onmicrosoft.com%2F<client-id-uuid>%2FUser.all
&client_id={client id}&redirect_uri=localhost%253A4200%252Flogin.html%3A

身份验证后,代码用于访问各种端点和 azure 函数。 在 hte 过程中,我们需要用户属性,如电子邮件、display_name、国家等用户在唱歌时输入的信息。 除了默认属性,我们还有一些自定义属性,例如 team_name,它特定于我们的 Web 应用程序用例。这些属性随时间变化。

例如:一个人可能会换队。因此我们使用 Graph APIs 在用户属性中修改它。 所以在那种情况下,如果属性 team_name = 'Team ABC' 现在更改为 team_name = 'Team XYZ'

但更改属性后,属性不会反映 access_token / refresh_tokenid_token 中的新值。有没有办法我们可以在不重新授权用户的情况下获取令牌中的刷新值?

目前我们从 Graph APIs 中获取用户属性,但如果我们在令牌中获取刷新值,它会更快更方便。

自定义策略没有公开记录的机制来在刷新令牌流中获取新的访问令牌声明。所以你所观察到的是预期的

作为一种解决方法,我们发现当通过 SSO cookie(Azure B2C 配置门户中的“Web 应用程序会话”)刷新身份验证时,声明会被刷新。

我认为这基本上相当于“重新登录”,但没有用户可见的提示。 我们正在使用 msal-browser 库自动为我们进行 SSO 登录(它为此使用了一个隐藏的 iframe),但我认为您也可以手动执行相同的操作。

您需要使用所有常用查询参数调用 /authorize 端点,并且:

  • prompt=none必须设置
  • 必须设置 sid(带帐户 ID)或 login_hint(带用户名)之一

我没有自己手动完成,所以我可能仍然遗漏了一些东西,但我认为这些应该是主要的东西。