示例#1
0
        public RefreshTokenResult RefreshToken(OAuthSiteInfo site)
        {
            RefreshTokenResult result          = null;
            ClaimsPrincipal    claimsPrincipal = _identityHelper.GetCurrentClaimsPrincipal();
            string             refreshToken    = claimsPrincipal?.Claims?.FirstOrDefault(c => c.Type == OAuthRefreshTokenClaimType)
                                                 ?.Value;

            if (!string.IsNullOrWhiteSpace(refreshToken))
            {
                HttpResponseMessage response;
                using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, "token"))
                {
                    request.Content = new FormUrlEncodedContent(new OAuthRefreshTokenRequest(site, refreshToken).ToDictionary());
                    response        = HttpClient.SendAsync(request).Result;
                }

                if (response.IsSuccessStatusCode)
                {
                    OAuthToken token = response.Content.ReadAsAsync <OAuthToken>().Result;
                    _identityHelper.UpdateClaim(new Claim(OAuthAccessTokenClaimType, token.Access_Token));
                    _identityHelper.UpdateClaim(new Claim(OAuthExpiresInClaimType, token.Expires_In));
                    _identityHelper.UpdateClaim(new Claim(OAuthRefreshTokenClaimType, token.Refresh_Token));

                    result = new RefreshTokenResult {
                        AccessToken = token.Access_Token, ExpiresIn = token.Expires_In
                    };
                }
                else
                {
                    Log.Error($"OAuth Authority responded with an error code: {response.Content.ReadAsStringAsync().Result}", this);
                }
            }

            return(result);
        }
示例#2
0
        public async void Update(RefreshTokenResult result)
        {
            if (result.IsError)
            {
                if (result.Error == "invalid_grant")
                {
                    Reset();
                }
                return;
            }
            AccessToken = result.AccessToken;
            AccessTokenExpirationTime = DateTime.Now.AddSeconds(result.ExpiresIn);
            if (result.RefreshToken != null)
            {
                RefreshToken = result.RefreshToken;
            }
            if (result.IdentityToken != null)
            {
                IdToken = result.IdentityToken;
            }
            await UpdateRevocationEndpointAsync();

            forceTokenRefresh = false;
            UpdateHooks?.Invoke();
        }
        public async Task AuthenticateRequestAsync(HttpRequestMessage request)
        {
            var token = _token;

            if (token == null || _token.IsError || _token.AccessTokenExpiration <= DateTime.Now)
            {
                token = await _flow.RefreshTokenAsync(_refreshToken);

                if (token.IsError)
                {
                    _token = null;
                    throw new ServiceException(
                              new Error
                    {
                        //Code = GraphErrorCode.AuthenticationFailure,
                        Message = _token.Error
                    });
                }

                _token = token;
            }

            var accessToken = token.AccessToken;

            if (!string.IsNullOrEmpty(accessToken))
            {
                request.Headers.Authorization = new AuthenticationHeaderValue(CoreConstants.Headers.Bearer, accessToken);
            }
        }
 public static Credentials ToCredentials(this RefreshTokenResult refreshTokenResult)
 => new Credentials
 {
     AccessToken           = refreshTokenResult.AccessToken,
     IdentityToken         = refreshTokenResult.IdentityToken,
     RefreshToken          = refreshTokenResult.RefreshToken,
     AccessTokenExpiration = refreshTokenResult.AccessTokenExpiration
 };
示例#5
0
        private static void RefreshAccessToken()
        {
            RefreshTokenResult refreshTokenResult = AsyncFuncHelper.RunSync(async() => await CurrentOidcClientInfo.OidcClient.RefreshTokenAsync(CurrentOidcClientInfo.RefreshToken));

            CurrentOidcClientInfo.AccessToken  = refreshTokenResult.AccessToken;
            CurrentOidcClientInfo.RefreshToken = refreshTokenResult.RefreshToken;
            CurrentOidcClientInfo.ValidDate    = refreshTokenResult.AccessTokenExpiration;
        }
示例#6
0
        public static async Task <HttpGetJsonResult> HttpGetJsonAsync(string uri, AuthState authState)
        {
            if (!authState.IsAuthorized)
            {
                return(new HttpGetJsonResult {
                    Code = X_HTTP_NEED_REAUTHZ
                });
            }
            if (authState.NeedsTokenRefresh)
            {
                RefreshTokenResult result;
                try {
                    result = await authState.Client.RefreshTokenAsync(authState.RefreshToken);

                    authState.Update(result);
                } catch (Exception e) {
                    result = new RefreshTokenResult {
                        Error = e.Message
                    };
                }
                if (result.IsError)
                {
                    return(new HttpGetJsonResult {
                        Code = authState.IsAuthorized ? X_HTTP_ERROR : X_HTTP_NEED_REAUTHZ,
                        Json = new { error = result.Error }
                    });
                }
            }

            try {
#if true
                // Use custom HttpClientHandler for demonstration. (next 4 lines)
                var handler = new HttpClientHandlerEx();
                handler.BeforeRequestAsyncHooks += LogPage.HttpRequestLoggerAsync;
                handler.AfterResponseAsyncHooks += LogPage.HttpResponseLoggerAsync;
                using (var client = new HttpClient(handler: handler)) {
#else
                // This is normal implementation.
                using (var client = new HttpClient()) {
#endif
                    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authState.AccessToken);
                    var response = await client.GetAsync(uri);

                    return(new HttpGetJsonResult {
                        Code = response.StatusCode == HttpStatusCode.Unauthorized ? X_HTTP_NEED_REAUTHZ : response.StatusCode,
                        Json = JsonConvert.DeserializeObject(await response.Content.ReadAsStringAsync())
                    });
                }
            } catch (Exception ex) {
                return(new HttpGetJsonResult {
                    Code = X_HTTP_ERROR,
                    Json = new { error = ex.GetType().Name, error_description = ex.Message }
                });
            }
        }
示例#7
0
        public async Task <Credentials> RefreshToken(string refreshToken)
        {
            try
            {
                OidcClient         oidcClient         = CreateOidcClient();
                RefreshTokenResult refreshTokenResult = await oidcClient.RefreshTokenAsync(refreshToken);

                return(refreshTokenResult.ToCredentials());
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                return(new Credentials {
                    Error = ex.ToString()
                });
            }
        }
示例#8
0
        public async Task <bool> RefreshAsync()
        {
            // Check secure storage for refresh token.
            EnsureAuthClient();
            RefreshTokenResult refreshResult = null;

            try
            {
                refreshResult = await _client.RefreshTokenAsync(RefreshToken);
            }
            catch (Exception e)
            {
                Debug.Log("UnityAuthClient::Exception during refresh: " + e.Message);
                return(false);
            }

            if (refreshResult.IsError)
            {
                Debug.Log("UnityAuthClient::Error authenticating: " + refreshResult.Error);
            }
            else
            {
                AccessToken           = refreshResult.AccessToken;
                RefreshToken          = refreshResult.RefreshToken;
                IdentityToken         = refreshResult.IdentityToken;
                AccessTokenExpiration = DateTime.Now.AddSeconds(refreshResult.ExpiresIn);

                KeyChain.SetString(refreshKey, RefreshToken);

                Debug.Log("UnityAuthClient::AccessToken: " + AccessToken);
                Debug.Log("UnityAuthClient::RefreshToken: " + RefreshToken);
                Debug.Log("UnityAuthClient::IdentityToken: " + IdentityToken);
                Debug.Log("UnityAuthClient::AccessTokenExpiration: " + AccessTokenExpiration);
                Debug.Log("UnityAuthClient::Refreshed.");
                return(true);
            }

            return(false);
        }
示例#9
0
        public static async Task <RefreshTokenResult> StartRefreshToken()
        {
            RefreshTokenResult refresh_token_result = new RefreshTokenResult();

            try
            {
                string url = String.Format("callback?refresh_token={0}", Settings.Default.RefreshToken);
                HttpResponseMessage response = await TokenClient.GetAsync(url);

                response.EnsureSuccessStatusCode();
                string response_body = await response.Content.ReadAsStringAsync();

                refresh_token_result.Token            = JsonConvert.DeserializeObject <Model.Token>(response_body);
                refresh_token_result.Token.token_time = DateTime.Now;
                refresh_token_result.Status           = 1;
                return(refresh_token_result);
            }
            catch (HttpRequestException e)
            {
                refresh_token_result.Status       = -1;
                refresh_token_result.ErrorMessage = e.Message;
                return(refresh_token_result);
            }
        }
示例#10
0
        /// <summary>
        /// Refreshes jwt token
        /// </summary>
        /// <param name="token">Old token</param>
        /// <returns>New token</returns>
        public async Task <RefreshTokenResult> RefreshToken(string token)
        {
            var tokenValidationParams = new TokenValidationParameters
            {
                ValidateIssuer           = false,
                ValidateAudience         = false,
                ValidateLifetime         = true,
                ValidateIssuerSigningKey = true,
                IssuerSigningKey         = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JwtSecurityKey"]))
            };

            ClaimsPrincipal principal;

            try
            {
                principal = new JwtSecurityTokenHandler().ValidateToken(token, tokenValidationParams, out var securityToken);
            }
            catch (Exception e)
            {
                return(null);
            }

            if (principal == null)
            {
                return(null);
            }

            if (!principal.Identity.IsAuthenticated)
            {
                return(null);
            }

            var userEmail = principal.Claims.FirstOrDefault(c => c.Type == ClaimTypes.Name).Value;

            if (userEmail == null)
            {
                return(null);
            }

            var userDb = await UserManager.FindByEmailAsync(userEmail);

            if (userDb == null)
            {
                return(null);
            }

            var userRoles = await UserManager.GetRolesAsync(userDb);

            var userBaseInfo = Mapper.Map <User, UserBaseInfo>(userDb);

            userBaseInfo.Roles = userRoles.Select(r => new RoleDto {
                Name = r
            });

            var result = new RefreshTokenResult
            {
                Token = await GenerateJwtToken(userDb),
                User  = userBaseInfo
            };

            return(result);
        }