Exemple #1
0
        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);
        }