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

时间:2016-01-26 15:36:05

标签: asp.net owin azure-active-directory openid-connect adal

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

我跟着this Microsoft sample构建了我的工作,它使用了ADAL .NET库和OpenIdConnect: Microsoft.IdentityModel.Clients.ActiveDirectory,Version = 2.19.0.0

在ADAL.NET中,我们使用 AuthenticationContext 实例和 TokenCache 的自定义继承类(请参阅code the sample code here)。

对于对授权资源的每个请求,根据API,我们调用其中一种方法(请参阅下面的代码)以获取将放入请求 Bearer <的 auth_token / em>参数。这是正确的方法吗?

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

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

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

1 个答案:

答案 0 :(得分:4)

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/

的更多背景信息