在此documentation中,它为调用Web API的Web应用程序提供了完整的流程:
- Web应用程序执行策略,用户完成用户体验。
- Azure AD B2C向浏览器返回一个(OpenID Connect)id_token和一个授权代码。
- 浏览器将id_token和授权代码发布到重定向URI。
- Web服务器验证id_token并设置会话cookie。
- Web服务器通过向其提供授权代码,应用程序客户端ID以及向Azure AD B2C询问access_token来 客户凭证。
- access_token和refresh_token返回到Web服务器。
- 使用授权标头中的access_token调用Web API。
- Web API会验证令牌。
- 安全数据返回到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。
使用相同的B2C租户和应用程序,使用浏览器和邮递员并按照此document中的步骤,我执行以得到预期的刷新令牌。
这个question与我的类似,其中一个答案中提到的blog post提供了一种解决方法,可以解决没有刷新令牌但我的问题仍然存在的问题:
如何获得AcquireTokenByAuthorizationCode
来返回一个刷新令牌?
答案 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
将返回刷新令牌。