public AzureADAuthRestResponse <AccessTokenClass, OAuthError> GetAccessToken_UserCredential(DatabaseManager dbmanager) { StateManager _stateIdManager = new StateManager(Config.LoggedInUserEmail, Config.Scope); LocalStorageManager _localStorage = new LocalStorageManager(Config, dbmanager); string _stateId = _stateIdManager.GetStateIdForCurrentUser(dbmanager); var resp = new AzureADAuthRestResponse <AccessTokenClass, OAuthError>(); // try to look for the available token first // if token not available then use authorize code to download it // if token expires then download new token using refresh token and store in database // if authorize token not available send send the response then auhorize token not available AccessTokenClass token = _localStorage.GetAccessToken(_stateId); if (token == null) { // check if authcode available AuthCode authcode = _localStorage.GetAuthCode(_stateId); if (authcode == null) { resp.OAuthError = OAuthErrors.AuthCodeNotFound; return(resp); } var res = GetAccessToken(authcode.code, TokenRetrivalType.AuthorizationCode); // check for any error in response if (res.IsSucceeded) { token = res.Result; _localStorage.AddAccessToken(_stateId, token); // add token into database } else { // send status to front page that it is not authorized, authorization code has expired resp.OAuthError = OAuthErrors.AuthCodeExpires; return(resp); } } // check for token's validity, if expires then recalculate from refresh token if (!validateToken(token)) { var res = GetAccessToken(token.RefreshToken, TokenRetrivalType.RefreshToken); // check for any error, if error is not present then cast to if (res.IsSucceeded) { token = res.Result; _localStorage.UpdateAccessToken(_stateId, token); } } resp.Result = token; resp.OAuthError = OAuthErrors.None; return(resp); }
public bool validateToken(AccessTokenClass token) { // check the time when token was retrived, add the expire time, that time should be less than the current time bool valid = false; DateTime MnfDateTime = token.MnfDateTime; DateTime expireDateTime = MnfDateTime.AddSeconds(token.ExpiresIn); int diff = DateTime.Compare(expireDateTime, DateTime.UtcNow); if (diff > 0) { valid = true; } return(valid); }
///<summary> /// This method search for the AccessToken in database based on stateId. /// An stateId is the unique code generated for combination of a user and a particular scope. /// AccessTokens are stored in database with stateId as primary key. /// If no AccessToken available in database then it returns null. /// <code> /// AccessTokenClass accessToken= localStoreManager.GetAccessToken(stateId); /// </code> ///</summary> public AccessTokenClass GetAccessToken(string stateId) { AccessTokenClass accessTokenClass = default(AccessTokenClass); AccessTokenClass[] accessTokens = _dbManager.ExecuteSQLReader <AccessTokenClass>("select * from access_tokens where stateid like '" + stateId + "'", x => new AccessTokenClass() { AccessToken = x["access_token"].ToString(), RefreshToken = x["refresh_token"].ToString(), ExtExpiresIn = Convert.ToInt32(x["ext_expires_in"]), ExpiresIn = Convert.ToInt32(x["expires_in"]), Scope = x["scope"].ToString(), TokenType = x["token_type"].ToString(), MnfDateTime = DateTime.Parse(x["MnfDateTime"].ToString()) }); if (accessTokens.Length > 0) { accessTokenClass = accessTokens.FirstOrDefault(); if (accessTokenClass.AccessToken == "") { _dbManager.ExecuteSQLWriter("delete from access_tokens where stateid like '" + stateId + "'"); accessTokenClass = null; } } return(accessTokenClass); }
public AzureADAuthRestResponse <AccessTokenClass, OAuthError> GetAccessToken(string code, TokenRetrivalType tokenRetrivalType) { RestClient _client = new RestClient(GetEndPoint(EndPointType.authorize)); RestRequest _request = new RestRequest(); _request = new RestRequest(Method.POST); _request.AddParameter("client_id", Config.ClientId); _request.AddParameter("scope", Config.Scope); if (tokenRetrivalType == TokenRetrivalType.AuthorizationCode) { _request.AddParameter("code", code); _request.AddParameter("grant_type", "authorization_code"); } else if (tokenRetrivalType == TokenRetrivalType.RefreshToken) { _request.AddParameter("refresh_token", code); _request.AddParameter("grant_type", "refresh_token"); } _request.AddParameter("redirect_uri", Config.RedirectURL); _request.AddParameter("client_secret", Config.ClientSecret); IRestResponse response = _client.Execute(_request); AzureADAuthRestResponse <AccessTokenClass, OAuthError> resp = new AzureADAuthRestResponse <AccessTokenClass, OAuthError>(); if (response.StatusCode == System.Net.HttpStatusCode.BadRequest) { OAuthError error = JsonConvert.DeserializeObject <OAuthError>(response.Content, Converter.Settings); resp.Error = error; resp.IsSucceeded = false; } else { AccessTokenClass result = JsonConvert.DeserializeObject <AccessTokenClass>(response.Content, Converter.Settings); resp.Result = result; resp.IsSucceeded = true; } return(resp); }
public AzureADAuthRestResponse <AccessTokenClass, OAuthError> GetAccessToken_FromClientCredential(string clientId, string resource, string clientSecret, string scope) { Config.ClientId = clientId; Config.Resource = resource; Config.ClientSecret = clientSecret; Config.Scope = scope; RestClient _client = new RestClient(); RestRequest _request = new RestRequest(); _client.BaseUrl = new Uri(GetEndPoint(EndPointType.token)); _request.Parameters.Clear(); _request.Method = Method.POST; _request.AddParameter("client_id", Config.ClientId); _request.AddParameter("grant_type", "client_credentials"); _request.AddParameter("resource", Config.Resource); _request.AddParameter("client_secret", Config.ClientSecret); _request.AddParameter("scope", Config.Scope); var response = _client.Execute(_request); AzureADAuthRestResponse <AccessTokenClass, OAuthError> resp = new AzureADAuthRestResponse <AccessTokenClass, OAuthError>(); if (response.StatusCode == System.Net.HttpStatusCode.BadRequest) { OAuthError error = JsonConvert.DeserializeObject <OAuthError>(response.Content, Converter.Settings); resp.Error = error; resp.IsSucceeded = false; } else { AccessTokenClass result = JsonConvert.DeserializeObject <AccessTokenClass>(response.Content, Converter.Settings); resp.Result = result; resp.IsSucceeded = true; } return(resp); }
///<summary> /// This method add AccessToken in database by associating with an stateId. /// An stateId is the unique code generated for combination of a user and a particular scope. /// <code> /// localStoreManager.AddAccessToken(stateId,accessToken); /// </code> ///</summary> public void AddAccessToken(string stateId, AccessTokenClass accessTokenClass) { var query = string.Format("insert into access_tokens values ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}')", stateId, accessTokenClass.AccessToken, accessTokenClass.RefreshToken, accessTokenClass.TokenType, _authConfig.Scope, accessTokenClass.ExtExpiresIn, accessTokenClass.ExpiresIn, DateTime.UtcNow.ToString()); _dbManager.ExecuteSQLWriter(query); }
///<summary> /// This method update an already existing AccessToken in databasem, associated with given stateId. /// An stateId is the unique code generated for combination of a user and a particular scope. /// <code> /// localStoreManager.UpdateAccessToken(stateId,accessTokenClass); /// </code> ///</summary> public void UpdateAccessToken(string stateId, AccessTokenClass accessTokenClass) { var query = string.Format("update access_tokens set access_token='{0}',refresh_token='{1}',ext_expires_in='{2}',expires_in='{3}',MnfDateTime='{4}' where stateid='{5}'", accessTokenClass.AccessToken, accessTokenClass.RefreshToken, accessTokenClass.ExtExpiresIn, accessTokenClass.ExpiresIn, DateTime.UtcNow.ToString(), stateId); _dbManager.ExecuteSQLWriter(query); }