public async Task <bool> GetAccessToken(bool throwExceptionIfFail) { bool success = true; Stopwatch timer = new Stopwatch(); timer.Start(); int timeout = this.Timeout; try { AuthenticationContext authContext = new AuthenticationContext(AuthorityUri); Task <AuthenticationResult> acquireTokenTask = null; if (!String.IsNullOrWhiteSpace(ClientSecret)) { // Get bearer token using a client secret ClaimsProviderLogging.Log($"[{ClaimsProviderName}] Getting new access token for tenant '{Tenant}' using client ID {ClientId} and a client secret.", TraceSeverity.Verbose, EventSeverity.Information, TraceCategory.Core); ClientCredential creds = new ClientCredential(ClientId, ClientSecret); acquireTokenTask = authContext.AcquireTokenAsync(ClaimsProviderConstants.GraphAPIResource, creds); } else { // Get bearer token using a client certificate ClaimsProviderLogging.Log($"[{ClaimsProviderName}] Getting new access token for tenant '{Tenant}' using client ID {ClientId} and a client certificate with thumbprint {ClientCertificate.Thumbprint}.", TraceSeverity.Verbose, EventSeverity.Information, TraceCategory.Core); ClientAssertionCertificate certCreds = new ClientAssertionCertificate(ClientId, ClientCertificate); acquireTokenTask = authContext.AcquireTokenAsync(ClaimsProviderConstants.GraphAPIResource, certCreds); } AuthNResult = await TaskHelper.TimeoutAfter <AuthenticationResult>(acquireTokenTask, new TimeSpan(0, 0, 0, 0, timeout)).ConfigureAwait(false); TimeSpan duration = new TimeSpan(AuthNResult.ExpiresOn.UtcTicks - DateTime.Now.ToUniversalTime().Ticks); ClaimsProviderLogging.Log($"[{ClaimsProviderName}] Got new access token for tenant '{Tenant}', valid for {Math.Round((duration.TotalHours), 1)} hour(s) and retrieved in {timer.ElapsedMilliseconds.ToString()} ms", TraceSeverity.High, EventSeverity.Information, TraceCategory.Core); } catch (AdalServiceException ex) { ClaimsProviderLogging.Log($"[{ClaimsProviderName}] Unable to get access token for tenant '{Tenant}': {ex.Message}", TraceSeverity.Unexpected, EventSeverity.Error, TraceCategory.Core); success = false; if (throwExceptionIfFail) { throw; } } catch (TimeoutException) { ClaimsProviderLogging.Log($"[{ClaimsProviderName}] Could not get access token before timeout of {timeout.ToString()} ms for tenant '{Tenant}'", TraceSeverity.Unexpected, EventSeverity.Error, TraceCategory.Core); success = false; if (throwExceptionIfFail) { throw; } } catch (Exception ex) { ClaimsProviderLogging.LogException(ClaimsProviderName, $"while getting access token for tenant '{Tenant}'", TraceCategory.Lookup, ex); success = false; if (throwExceptionIfFail) { throw; } } finally { timer.Stop(); } return(success); }