使用 Microsoft.IdentityModel.Clients.ActiveDirectory 在 AuthenticationContext 实例上调用 AcquireTokenByRefreshToken 时?

When calling AcquireTokenByRefreshToken on the AuthenticationContext instance with Microsoft.IdentityModel.Clients.ActiveDirectory?

我正在开发一个在我的 Azure AD 上注册的多租户应用程序,该应用程序使用 Office 365 api、Graph API 等

我按照 this Microsoft sample 构建了我的作品,它使用 ADAL .NET 库和 OpenIdConnect:Microsoft.IdentityModel.Clients.ActiveDirectory,版本=2.19.0.0

在 ADAL.NET 中,我们使用 AuthenticationContext 实例,其中自定义继承 class 用于 TokenCache (参见 code the sample code here)。

对于授权资源的每个请求,根据 API,我们调用这些方法之一(见下面的代码)来获取 auth_token 将被放入请求 Bearer 参数中。这是正确的方法吗?

我们从不使用 AcquireTokenByRefreshTokenAsync 方法,这是否意味着我们的应用程序从不使用 refresh_token?这是否意味着我们的用户必须在一小时后重新登录?我们是否应该在 catch 语句中使用 AcquireTokenByRefreshTokenAsync 实现一种刷新过程?可以在不提示最终用户的情况下制作吗?

备注:我发布了一个关于 的问题。对我来说,这两个问题是无关的,但它们可能是。

string signInUserId = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value;
string userObjectId = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value;
string tenantId = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid").Value;


public async Task<string> AcquireOutlook365TokenAsync()
{
     AuthenticationContext authContext = new AuthenticationContext(string.Format("{0}/{1}", SettingsHelper.AuthorizationUri, tenantId), new ADALTokenCache(signInUserId));
     try
     {
         var result = await authContext.AcquireTokenSilentAsync(@"https://outlook.office365.com/",
             new ClientCredential(SettingsHelper.ClientId, SettingsHelper.AppKey),
             new UserIdentifier(userObjectId, UserIdentifierType.UniqueId));
         return result.AccessToken;
     }
     catch (AdalException exception)
     {
         //handle token acquisition failure
         if (exception.ErrorCode == AdalError.FailedToAcquireTokenSilently)
         {
             authContext.TokenCache.Clear();
         }
         throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.Unauthorized));
     }
 }

 public async Task<string> AcquireAzureGraphTokenAsync()
 {
     AuthenticationContext authContext = new AuthenticationContext(string.Format("{0}/{1}", SettingsHelper.AuthorizationUri, tenantId), new ADALTokenCache(signInUserId));
     try
     {
         var result = await authContext.AcquireTokenSilentAsync(@"https://graph.windows.net/",
             new ClientCredential(SettingsHelper.ClientId, SettingsHelper.AppKey),
             new UserIdentifier(userObjectId, UserIdentifierType.UniqueId));
         return result.AccessToken;
     }
     catch (AdalException exception)
     { 
      //Same as other method
     }
 }

ADAL 自动且透明地使用存储的刷新令牌,您不需要执行任何显式操作。由于遗留原因,AcquireTOkenByRefreshToken 在 ADAL 界面中,并且已从版本 3.x 中删除。 http://www.cloudidentity.com/blog/2015/08/13/adal-3-didnt-return-refresh-tokens-for-5-months-and-nobody-noticed/

处有更多背景资料