1

在本文档中,它提供了调用 Web API 的 Web 应用程序的完整流程:

  1. Web 应用程序执行策略,用户完成用户体验。
  2. Azure AD B2C 向浏览器返回一个 (OpenID Connect) id_token 和一个授权代码。
  3. 浏览器将 id_token 和授权代码发布到重定向 URI。
  4. Web 服务器验证 id_token 并设置会话 cookie。
  5. Web 服务器通过向 Azure AD B2C 提供授权代码、应用程序客户端 ID 和客户端凭据来向 Azure AD B2C 请求 access_token。
  6. access_token 和 refresh_token 返回到 Web 服务器。
  7. 使用授权标头中的 access_token 调用 Web API。
  8. Web API 验证令牌。
  9. 安全数据返回到 Web 应用程序。

查看 6. 并使用 Azure-Samples 存储库中的代码active-directory-b2c-dotnet-webapp-and-webapi ,我无法得到该行

AuthenticationResult result = await confidentialClient.AcquireTokenByAuthorizationCode(Globals.Scopes, notification.Code).ExecuteAsync();

返回一个 refresh_token。它返回一个 IdToken 和 AccessToken 但没有 RefreshToken。 断点结果截图

通过使用我的浏览器和 Postman 并按照本文档中的步骤使用相同的 B2C 租户和应用程序,我确实按预期获得了刷新令牌。

这个问题与我的类似,并且其中一个答案中提到的博客文章提供了解决没有刷新令牌的症状的方法,但我的问题仍然存在:

我怎样才能AcquireTokenByAuthorizationCode返回一个 refresh_token?

4

2 回答 2

1

要获取刷新令牌,您的应用程序应附加offline_access作为范围。

你提到这个msdn 能够返回你刷新令牌。这是因为请求已经包含了offline_access 范围

&scope=openid%20offline_access

active-directory-b2c-dotnet-webapp-and-webapi获取刷新令牌。您需要更新Global.cs Scopes 文件以包含 offline_access

public static string[] Scopes = new string[] { ReadTasksScope, WriteTasksScope, "offline_access" };
于 2019-10-16T06:55:37.843 回答
1

对于web 应用程序来说, offline_access范围是可选的。它表明您的应用需要刷新令牌才能长期访问资源。

转到 web.config 添加以下内容:

 <add key ="api:OfflineAccessScope" value="offline_access "/>

在 Global.cs 中:

public static string OfflineAccessScope = ApiIdentifier + ConfigurationManager.AppSettings["api:OfflineAccessScope"];
public static string[] Scopes = new string[] { ReadTasksScope, WriteTasksScope, OfflineAccessScope};

然后Globals.ScopesinAcquireTokenByAuthorizationCode将返回刷新令牌。

于 2019-10-16T07:00:34.520 回答