Azure AD B2C 不返回刷新令牌

Azure AD B2C Not Returning Refresh Tokens

我正在开发一个 SPA,使用 Azure AD B2C 作为身份提供者。我正在使用 MSAL JavaScript library,它大部分工作正常。我可以为我的 Web API 后端创建用户、登录并获取访问令牌。

目前唯一的问题是 B2C 端点不返回刷新令牌,因此当访问令牌过期时,UserAgentApplication class 中的 acquireTokenSilent 方法旨在使用刷新令牌,失败。

我在 B2C 中的应用程序在其属性中配置了 "Include web app / web API" 和 "Allow implicit flow" 设置为 "Yes"。在 API 访问部分,"openid" 和 "offline_access" 范围都在 "Access the user's profile" 下勾选。应用程序本身有 "read"、"write" 和 "user_impersonation" 范围(不确定这是否重要)。

"offline_access" 包含在我的范围中,我尝试创建一个应用程序,例如 read/write 范围并将其也包括在内(如“https://mytenant.onmicrosoft.com/testapp/offline_access”)但似乎什么也没有上班。响应从来没有刷新令牌,无论是 ID 令牌还是访问令牌。

我注意到,当我转到我创建的 SignUp-SignIn 策略并尝试从那里 运行 端点时,"offline_access" 范围甚至在 drop 中不可用-吃下。即使我在底部复制 "run endpoint" link 并在 运行 之前将范围添加到 URL,响应也不包含刷新令牌。

当我单击顶部的 link 时,它似乎为我提供了有关端点的一些详细信息,并且只有 "openid" 在受支持的范围内。

不确定我在这里遗漏了什么,所以任何想法将不胜感激。

运行现在link生成一个使用implicit flow to log in. Implicit flows, by definition, do not allow you to obtain a refresh token due to security reasons. Therefore, the drop down does not give you the offline_access scope since it won't work. If you want a refresh token, you need to run through the confidential code flow的授权请求。如果您愿意,可以通过手动修改 "Run now" link 生成的 URL 来实现。具体来说,在 URL:

  1. 设置response_type=code(不是token)

  2. 将 "offline_access" 添加到范围列表

获得代码后,如 documentation 中所示发出 POST 请求以用代码交换刷新令牌。