private static UserInfoSettings SaveUserInfo(AuthenticationResult authResult)
        {
            var userInfo = new UserInfoSettings {
                Expiration = authResult.ExpiresOn, UserPrincipalName = authResult.UserInfo.DisplayableId, AccessToken = authResult.AccessToken
            };

            userInfo.Save();
            return(userInfo);
        }
        /// <summary>
        /// Gets an access token in order to discover the onedrive for business endpoint of the authenticated user.
        /// </summary>
        /// <param name="appClientId">client application id</param>
        /// <returns>An instance of AuthenticationResult with the access token</returns>
        internal static async Task <IdentityModel.Clients.ActiveDirectory.AuthenticationResult> AuthenticateAdalUserForDiscoveryAsync(string appClientId)
        {
            var discoveryResourceUri = "https://api.office.com/discovery/";

            _appClientId = appClientId;
            IdentityModel.Clients.ActiveDirectory.AuthenticationResult userAuthnResult = await _azureAdContext.AcquireTokenAsync(discoveryResourceUri, appClientId, new Uri(DefaultRedirectUri), new IdentityModel.Clients.ActiveDirectory.PlatformParameters(PromptBehavior.Auto, true));

            _userInfoSettings = SaveUserInfo(userAuthnResult);
            return(userAuthnResult);
        }
        /// <summary>
        /// Get a Microsoft Graph access token from Azure AD.
        /// </summary>
        /// <param name="refreshToken">Flag indicating if the token has to be redeem</param>
        /// <returns>An oauth2 access token.</returns>
        internal static async Task <string> AuthenticateAdalUserAsync(bool refreshToken = false)
        {
            if (_userInfoSettings == null && refreshToken == false)
            {
                _userInfoSettings = SaveUserInfo(await _azureAdContext.AcquireTokenAsync(_resourceUri, _appClientId, new Uri(DefaultRedirectUri), new IdentityModel.Clients.ActiveDirectory.PlatformParameters(PromptBehavior.RefreshSession, false)));
            }

            if (_userInfoSettings.Expiration <= DateTimeOffset.UtcNow.AddMinutes(5) || refreshToken == true)
            {
                _userInfoSettings = SaveUserInfo(await _azureAdContext.AcquireTokenSilentAsync(_resourceUri, _appClientId));
            }

            return(_userInfoSettings.AccessToken);
        }
        /// <summary>
        /// Logout the current user
        /// </summary>
        /// <returns>success or failure</returns>
        public override async Task LogoutAsync()
        {
            if (!IsInitialized)
            {
                throw new InvalidOperationException("Microsoft OneDrive not initialized.");
            }

            if (_accountProvider != null)
            {
                if (_accountProviderType == AccountProviderType.OnlineId || _accountProviderType == AccountProviderType.Msa)
                {
                    await((MsaAuthenticationProvider)_accountProvider).SignOutAsync();
                }
                else if (_accountProviderType == AccountProviderType.Adal)
                {
                    OneDriveAuthenticationHelper.AzureAdContext.TokenCache.Clear();
                    DiscoverySettings.Clear();
                    UserInfoSettings.Clear();
                }
            }
        }