【问题标题】:Why doesn't AcquireTokenByAuthorizationCode return RefreshToken为什么 AcquireTokenByAuthorizationCode 不返回 RefreshToken
【发布时间】:2020-02-12 20:45:17
【问题描述】:

documentation 中,它为调用 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 和 客户端凭据。
  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 并按照 document 中的步骤使用相同的 B2C 租户和应用程序,我确实按预期获得了刷新令牌。

这个question 与我的相似,其中一个答案中提到的blog post 提供了解决没有刷新令牌但我的问题仍然存在的症状:

如何让AcquireTokenByAuthorizationCode 返回一个 refresh_token?

【问题讨论】:

    标签: c# azure azure-ad-b2c microsoft-identity-platform


    【解决方案1】:

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

    你提到像thismsdn 能够返回你刷新令牌。这是因为请求已经包含了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" };
    

    【讨论】:

    • 我之前尝试过,但仍然收到错误:MSAL 始终发送范围“openid profile offline_access”。
    【解决方案2】:

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

    转到 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};
    

    那么AcquireTokenByAuthorizationCode中的Globals.Scopes会返回刷新令牌。

    【讨论】:

    • 我之前尝试过,但仍然出现错误:MSAL 始终发送范围“openid profile offline_access”。
    • 有道理,谢谢;有了这些 access_token 没有显示脱机范围,所以我还将这些添加到 Startup_Auth Scope = $"openid profile offline_access {Globals.ReadTasksScope} {Globals.WriteTasksScope} {Globals.OfflineTasksScope}" 并且 access_token 显示 scp: "demo. offline_access demo.read demo.write”,但请求不返回刷新令牌
    猜你喜欢
    • 1970-01-01
    • 2017-10-08
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    相关资源
    最近更新 更多