为什么AcquireTokenByAuthorizationCode不返回RefreshToken

时间:2019-10-16 06:31:14

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

在此documentation中,它为调用Web API的Web应用程序提供了完整的流程:

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

看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。 screenshot of breakpoint result

使用相同的B2C租户和应用程序,使用浏览器和邮递员并按照此document中的步骤,我执行以得到预期的刷新令牌。

这个question与我的类似,其中一个答案中提到的blog post提供了一种解决方法,可以解决没有刷新令牌但我的问题仍然存在的问题:

如何获得AcquireTokenByAuthorizationCode来返回一个刷新令牌?

2 个答案:

答案 0 :(得分:0)

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

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

&scope=openid%20offline_access

要从active-directory-b2c-dotnet-webapp-and-webapi获取刷新令牌。您需要更新Global.cs合并的范围以包括offline_access

public static string[] Scopes = new string[] { ReadTasksScope, WriteTasksScope, "offline_access" };

答案 1 :(得分:0)

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

然后,Globals.Scopes中的AcquireTokenByAuthorizationCode将返回刷新令牌。