예제 #1
0
 public HttpRequest(string requestURL, HttpMethod method, TContent content, NameValueCollection queryString, OAuthTokenEntity token)
 {
     RequestURL  = requestURL ?? throw new ArgumentNullException(nameof(requestURL));
     Method      = method;
     Content     = content;
     QueryString = queryString == null ? new NameValueCollection() : queryString;
     AccessToken = token;
 }
예제 #2
0
        private async Task <OAuthTokenEntity> EnsureUserAsync(string access_token)
        {
            var token = await DBContext.OAuthTokens.SingleOrDefaultAsync(t => t.Value == access_token && (t.Expiry == null || t.Expiry.Value > DateTime.Now));

            // User exists, short circuit out
            if (!string.IsNullOrEmpty(token?.UserId))
            {
                return(token);
            }

            var profileUri   = UriPath.Combine(Config.PathOfExileApi.Route, "/profile");
            var profileQuery = QueryHelpers.AddQueryString(profileUri, nameof(access_token), access_token);

            using var client   = new HttpClient();
            using var response = await client.GetAsync(profileQuery);

            if (!response.IsSuccessStatusCode)
            {
                throw new AuthenticationException(response.ReasonPhrase);
            }

            var contentRaw = await response.Content.ReadAsStringAsync();

            var profile = JsonConvert.DeserializeObject <ProfileResponse>(contentRaw);

            if (string.IsNullOrEmpty(profile?.Name))
            {
                throw new AuthenticationException();
            }

            var user = await UserManager.FindByNameAsync(profile.Name);

            if (user == null)
            {
                user = new UserEntity
                {
                    UserName = profile.Name,
                    Name     = profile.Name,
                    Realm    = profile.Realm,
                    UUID     = profile.UUID
                };

                var result = await UserManager.CreateAsync(user);

                if (!result.Succeeded)
                {
                    throw new AuthenticationException(result.Errors.First().Description);
                }
            }

            token = new OAuthTokenEntity
            {
                Value  = access_token,
                UserId = user.Id
            };

            return(token);
        }
예제 #3
0
        private RedirectResult BackToHome(OAuthTokenEntity token = null)
        {
            if (token == null)
            {
                return(Redirect(Config.Origin));
            }

            var cookieOptions = new CookieOptions
            {
                Path        = "/",
                IsEssential = true,
                Expires     = token.Expiry,
            };

            Response.Cookies.Append("access_token", token.Value, cookieOptions);

            return(Redirect(Config.Origin));
        }
예제 #4
0
        public virtual string GetToken(string clientId, string userId, string returnUrl)
        {
            Identity = clientId;
            TokenContext.TargetUrl = returnUrl;

            _logger.Debug(string.Format("clientid: {0},returnUrl: {1}", clientId, returnUrl));

            if (_clientRules.Select(clientRule => clientRule.Verfy(TokenContext)).Any(r => r.Status != (int)OAuthTokenStatus.Ok))
            {
                return(string.Empty);
            }

            var entity = new OAuthTokenEntity
            {
                ClientId       = clientId,
                CreatedDateUtc = DateTime.UtcNow,
                UserId         = userId,
                Token          = Guid.NewGuid().ToString().Replace("-", ""),
                ExpiredDateUtc = DateTime.UtcNow.AddSeconds(MaxExpireDate)
            };

            try
            {
                using (var tran = new TransactionScope())
                {
                    //clear timeout token for current user to reduce data set size
                    OauthTokenDataService.Repository.Entities.Where(x => x.ClientId == clientId && x.UserId == userId).Delete();
                    OauthTokenDataService.Repository.Insert(entity);

                    tran.Complete();
                }
            }
            catch (Exception e)
            {
                _logger.Error <string>(e, e.InnerException.Message);
            }

            return(entity.Id > 0 ? entity.Token : string.Empty);
        }
예제 #5
0
        public Tuple <OAuthErrorType, OAuthTokenEntity> GetToken(string clientID, string code)
        {
            OAuthCodeEntity codeEntity = AccessCodeDataProvider.Instance.Get(code, clientID);

            if (codeEntity == null)
            {
                return(Tuple.Create(OAuthErrorType.UnAuthorizedClient, new OAuthTokenEntity()));
            }
            ClientEntity     clientEntity = ClientInformationDataProvider.Instance.GetClientMetadata(clientID);
            OAuthTokenEntity accessToken  = new OAuthTokenEntity()
            {
                AccessToken  = RandomGenerator.GeneratorRandomNQCode(32),
                TokenType    = "authorization_code",
                ExpiresIn    = clientEntity.ExpiresIn,
                RefreshToken = RandomGenerator.GeneratorRandomNQCode(32),
                Scopes       = codeEntity.Scopes,
                StartTime    = ConvertTimespan.Get(DateTime.Now)
            };

            TokenDataProvider.Instance.Insert(accessToken);

            return(Tuple.Create(OAuthErrorType.NoError, accessToken));
        }
 internal void Insert(OAuthTokenEntity entity)
 {
     this.GetCollection <OAuthTokenEntity>().InsertOne(entity);
 }
예제 #7
0
        public static async Task Authenticate()
        {
            string redirect_URL              = ConfigurationManager.AppSettings.Get("OAUTH_REDIRECT");
            string gitkraken_authorize_URL   = ConfigurationManager.AppSettings.Get("GITKRAKEN_AUTHORIZE");
            string gitkraken_accessToken_URL = ConfigurationManager.AppSettings.Get("GITKRAKEN_ACCESSTOKEN");
            string clientID     = ConfigurationManager.AppSettings.Get("OAUTH_CLIENTID");
            string clientSecret = ConfigurationManager.AppSettings.Get("OAUTH_SECRET");
            int    loginTimeout = int.Parse(ConfigurationManager.AppSettings.Get("APP_LOGIN_TIMEOUT"));

            string state = randomB64(32);

            _listener = new HttpListener();
            _listener.Prefixes.Add(redirect_URL);
            _listener.Start();

            string request_URL = string.Format("{0}?response_type=code&scope=board:write user:read&state={1}&client_id={2}", new object[] {
                gitkraken_authorize_URL,
                state,
                clientID
            });

            System.Diagnostics.Process.Start(request_URL);

            Timer timeoutTimer = new Timer
            {
                Enabled   = true,
                AutoReset = false,
                Interval  = loginTimeout
            };

            timeoutTimer.Elapsed += new ElapsedEventHandler(StopListening);

            HttpListenerContext requestContext = null;

            try
            {
                requestContext = await _listener.GetContextAsync();
            }
            catch (HttpListenerException)
            {
                SendPage("UI\\HTML\\OAuthErrorPage.html", requestContext.Response);
                requestContext.Response.StatusCode = 500;;
                LastErrorMessage = "You took too long to login. Try again.";

                return;
            }

            OAuthCodeEntity oAuthResponse = OAuthCodeEntity.CreateEntity(requestContext.Request);

            if (!state.Equals(oAuthResponse.State))
            {
                SendPage("UI\\HTML\\OAuthErrorPage.html", requestContext.Response);
                requestContext.Response.StatusCode = 500;

                throw new OAuthException("Error Validation Token. Please Try Again.");
            }
            else
            {
                SendPage("UI\\HTML\\OAuthSuccessPage.html", requestContext.Response);
                requestContext.Response.StatusCode = 200;
            }

            requestContext.Response.Close();
            _listener.Stop();

            AccessTokenSegment tokenRequestBody = new AccessTokenSegment("authorization_code", clientID, clientSecret, oAuthResponse.Code);

            HttpRequest <AccessTokenSegment> tokenRequest = new HttpRequest <AccessTokenSegment>(gitkraken_accessToken_URL, HttpMethod.Post, tokenRequestBody, null, AccessToken);

            AccessToken = await Requesting.MakeRequest <OAuthTokenEntity>(tokenRequest);
        }