Пример #1
0
        public static async Task <ResponseTokenViewModel> GenerateJwt(
            ClaimsIdentity identity,
            IJwtFactory jwtFactory,
            string userName,
            JwtIssuerOptions jwtOptions,
            JsonSerializerSettings serializerSettings)
        {
            var response = new ResponseTokenViewModel
            {
                Id      = identity.Claims.Single(c => c.Type == "id").Value,
                Token   = await jwtFactory.GenerateEncodedToken(userName, identity),
                Expires = (int)jwtOptions.ValidFor.TotalSeconds
            };

            return(response);
        }
Пример #2
0
        private async Task <ResponseTokenViewModel> GenerateAccessAndRefreshToken(RequestTokenViewModel requestToken, string ipAddress)
        {
            ResponseTokenViewModel responseToken = new ResponseTokenViewModel();
            AppUser appUser = await _userManager.FindUserWithRolesByNameAsync(requestToken.UserName);

            if (appUser != null && !string.IsNullOrWhiteSpace(requestToken.RefreshToken))
            {
                RefreshToken oldRefreshToken = await _refreshTokenService.OldRefreshToken(_siteSettings.RefreshTokenSetting.ClientId, requestToken.RefreshToken, ipAddress);

                if (oldRefreshToken != null)
                {
                    AppUser userToken = await _userManager.FindByIdAsync(oldRefreshToken.UserId.ToString());

                    if (userToken == null)
                    {
                        throw new AppException(ApiResultStatusCode.LogOut, NotificationMessages.UnAuthorize, HttpStatusCode.Unauthorized);
                    }
                    if (oldRefreshToken.ExpireDate < DateTime.Now)
                    {
                        throw new AppException(ApiResultStatusCode.LogOut, NotificationMessages.UnAuthorize, HttpStatusCode.Unauthorized);
                    }

                    else
                    {
                        responseToken.RefreshToken = oldRefreshToken.Value;
                        responseToken.AccessToken  = await GenerateAccessTokenAsync(appUser);
                    }
                }
                else
                {
                    throw new AppException(ApiResultStatusCode.LogOut, NotificationMessages.UserNotFound, HttpStatusCode.Unauthorized);
                }
            }
            else
            {
                throw new AppException(ApiResultStatusCode.LogOut, NotificationMessages.UserNotFound, HttpStatusCode.Unauthorized);
            }

            return(responseToken);
        }
Пример #3
0
        public ResponseTokenViewModel GeTokenViewModel(string username, string userid)
        {
            var refreshtoken = Guid.NewGuid().ToString("N");
            var now          = DateTime.UtcNow;

            var claims = new List <Claim>()
            {
                new Claim(JwtRegisteredClaimNames.NameId, ""),
                new Claim(JwtRegisteredClaimNames.Jti, ""),
                new Claim(JwtRegisteredClaimNames.Iat, new DateTimeOffset(now).ToUniversalTime().ToUnixTimeSeconds().ToString(), ClaimValueTypes.Integer64),
                new Claim(JwtRegisteredClaimNames.Sub, username),
            };
            var jwt = new JwtSecurityToken(
                issuer: _options.Issuer,
                audience: _options.Audience,
                claims: claims.ToArray(),
                notBefore: now,
                expires: now.AddMinutes(_options.Expiration),
                signingCredentials: new SigningCredentials(new SymmetricSecurityKey(Encoding.ASCII.GetBytes(_options.SecretKey)), SecurityAlgorithms.HmacSha256));
            var encodedJwt = new JwtSecurityTokenHandler().WriteToken(jwt);

            _unitOfWork.DbContext.SysUserTokenses.Add(new SysUserTokens()
            {
                ExpiresUtc = DateTime.UtcNow, Token = encodedJwt, UserId = userid, Value = refreshtoken, LoginProvider = "", Name = username
            });
            _unitOfWork.SaveChanges();
            ResponseTokenViewModel model = new ResponseTokenViewModel()
            {
                access_token  = encodedJwt,
                refresh_token = refreshtoken,
                expires_in    = (int)TimeSpan.FromSeconds(_options.Expiration * 60).TotalSeconds,
                userName      = username,
                firstname     = username,
                lastname      = username,
                createtime    = DateTime.Now
            };

            return(model);
        }
Пример #4
0
        public async Task <ResponseTokenViewModel> AuthenticateUser(HttpRequest request, RequestTokenViewModel requestToken)
        {
            string ipAddress = _httpContextAccessor.HttpContext.Connection?.RemoteIpAddress.ToString();

            ResponseTokenViewModel responseTokenViewModel = new ResponseTokenViewModel();

            if (requestToken.GrantType == "Password")
            {
                AppUser user = await _userManager.FindUserWithRolesByNameAsync(requestToken.UserName);

                if (user == null)
                {
                    responseTokenViewModel.IsSuccess     = false;
                    responseTokenViewModel.Message       = NotificationMessages.UserNotFound;
                    responseTokenViewModel.ApiStatusCode = ApiResultStatusCode.UnAuthorized;

                    //throw new AppException(ApiResultStatusCode.UnAuthorized, NotificationMessages.UserNotFound, HttpStatusCode.BadRequest);
                }
                else
                {
                    bool result = await _userManager.CheckPasswordAsync(user, requestToken.Password);

                    if (!result)
                    {
                        responseTokenViewModel.IsSuccess     = false;
                        responseTokenViewModel.Message       = NotificationMessages.InvalidUserNameOrPassword;
                        responseTokenViewModel.ApiStatusCode = ApiResultStatusCode.UnAuthorized;
                        // throw new AppException(ApiResultStatusCode.UnAuthorized, NotificationMessages.InvalidUserNameOrPassword, HttpStatusCode.BadRequest);
                    }
                    else
                    {
                        UserViewModelApi userViewModel = await _userManager.FindUserApiByIdAsync(user.Id);

                        userViewModel.Image = $"{request.Scheme}://{request.Host}{request.PathBase.Value}/wwwroot/Users/{userViewModel.Image}";

                        RefreshToken oldRefreshToken = await _refreshTokenService.GetRefreshTokenByUserIdAsync(user.Id);

                        if (oldRefreshToken != null)
                        {
                            await _refreshTokenService.RemoveRefreshTokenAsync(oldRefreshToken);
                        }

                        RefreshToken refreshToken = _refreshTokenService.CreateRefreshToken(_siteSettings.RefreshTokenSetting, user.Id, requestToken.IsRemember, ipAddress);
                        await _refreshTokenService.AddRefreshTokenAsync(refreshToken);

                        responseTokenViewModel.AccessToken = await GenerateAccessTokenAsync(user);

                        responseTokenViewModel.RefreshToken = refreshToken.Value;
                        responseTokenViewModel.User         = userViewModel;
                        responseTokenViewModel.IsSuccess    = true;
                    }
                }
            }
            else if (requestToken.GrantType == "RefreshToken")
            {
                responseTokenViewModel = await GenerateAccessAndRefreshToken(requestToken, ipAddress);
            }
            else
            {
                responseTokenViewModel.IsSuccess     = false;
                responseTokenViewModel.ApiStatusCode = ApiResultStatusCode.NotFound;
                responseTokenViewModel.Message       = NotificationMessages.UserNotFound;
                //throw new AppException(ApiResultStatusCode.BadRequest, NotificationMessages.TargetNotFounded, HttpStatusCode.BadRequest);
            }
            return(responseTokenViewModel);
        }