public IEnumerable <IBearerTokenProvider> Get(string authority) { IAdalTokenProvider adalTokenProvider = adalTokenProviderFactory.Get(authority); return(new IBearerTokenProvider[] { // Order here is important - providers (potentially) run in this order. new AdalCacheBearerTokenProvider(adalTokenProvider), new WindowsIntegratedAuthBearerTokenProvider(adalTokenProvider), new UserInterfaceBearerTokenProvider(adalTokenProvider, logger), new DeviceCodeFlowBearerTokenProvider(adalTokenProvider, logger) }); }
public async Task <BearerTokenResult> GetAsync(Uri uri, bool isRetry, bool isNonInteractive, bool canShowDialog, CancellationToken cancellationToken) { var authority = await authUtil.GetAadAuthorityUriAsync(uri, cancellationToken); logger.Verbose(string.Format(Resources.AdalUsingAuthority, authority)); var adalTokenProvider = adalTokenProviderFactory.Get(authority.ToString()); cancellationToken.ThrowIfCancellationRequested(); IAdalToken adalToken; // Try to acquire token silently if (!isRetry) { adalToken = await adalTokenProvider.AcquireTokenSilentlyAsync(cancellationToken); if (adalToken?.AccessToken != null) { logger.Verbose(Resources.AdalAcquireTokenSilentSuccess); return(new BearerTokenResult(adalToken.AccessToken, obtainedInteractively: false)); } else { logger.Verbose(Resources.AdalAcquireTokenSilentFailed); } } // Try Windows Integrated Auth if supported if (WindowsIntegratedAuthUtils.SupportsWindowsIntegratedAuth()) { adalToken = await adalTokenProvider.AcquireTokenWithWindowsIntegratedAuth(cancellationToken); if (adalToken?.AccessToken != null) { logger.Verbose(Resources.AdalAcquireTokenWIASuccess); return(new BearerTokenResult(adalToken.AccessToken, obtainedInteractively: false)); } else { logger.Verbose(Resources.AdalAcquireTokenWIAFailed); } } // Interactive flows if allowed if (!isNonInteractive) { #if NETFRAMEWORK if (canShowDialog && RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { // Try UI prompt adalToken = await adalTokenProvider.AcquireTokenWithUI(cancellationToken); if (adalToken?.AccessToken != null) { return(new BearerTokenResult(adalToken.AccessToken, obtainedInteractively: true)); } } #endif // Try device flow adalToken = await adalTokenProvider.AcquireTokenWithDeviceFlowAsync( (DeviceCodeResult deviceCodeResult) => { logger.Minimal(string.Format(Resources.AdalDeviceFlowRequestedResource, uri.ToString())); logger.Minimal(string.Format(Resources.AdalDeviceFlowMessage, deviceCodeResult.VerificationUrl, deviceCodeResult.UserCode)); return(Task.CompletedTask); }, cancellationToken); if (adalToken?.AccessToken != null) { logger.Verbose(Resources.AdalAcquireTokenDeviceFlowSuccess); return(new BearerTokenResult(adalToken.AccessToken, obtainedInteractively: true)); } else { logger.Verbose(Resources.AdalAcquireTokenDeviceFlowFailed); } } else if (isRetry) { logger.Warning(Resources.CannotRetryWithNonInteractiveFlag); } logger.Verbose(string.Format(Resources.AdalTokenNotFound, uri.ToString())); return(null); }