public virtual async Task <JsonResult> Add([FromBody] A model)
        {
            if (!ModelState.IsValid)
            {
                return(new JsonAPIResult(_apiResult.CreateVMWithModelState(modelStateDictionary: ModelState),
                                         StatusCodes.Status400BadRequest));
            }

            var result = await _service.AddAsync(model, User.GetId());

            if (result.ResultIsNotTrue())
            {
                return(new JsonAPIResult(result, StatusCodes.Status422UnprocessableEntity));
            }

            return(new JsonAPIResult(_apiResult.CreateVM(result.RecId, result.ResultIsTrue()),
                                     StatusCodes.Status200OK));
        }
        public async Task <JsonResult> Register([FromBody] UserRegisterVM model)
        {
            if (!ModelState.IsValid)
            {
                return(new JsonAPIResult(_apiResult.CreateVMWithModelState(modelStateDictionary: ModelState),
                                         StatusCodes.Status400BadRequest));
            }

            User entity = _mapper.Map <UserRegisterVM, User>(model);

            entity.Id             = Guid.NewGuid();
            entity.CreateDateTime = DateTime.UtcNow;

            var claims = new Claim[] {
                new Claim(JwtRegisteredClaimNames.Sub, entity.Id.ToString()),
                new Claim(JwtRegisteredClaimNames.UniqueName, entity.UserName),
                new Claim("UserId", entity.Id.ToString())
            };

            TokenCacheVM authData = new TokenCacheVM();

            authData.AccessToken            = _tokenService.GenerateAccessToken(claims);
            authData.RefreshToken           = _tokenService.GenerateRefreshToken();
            authData.AccessTokenExpiryTime  = new JwtSecurityTokenHandler().ReadToken(authData.AccessToken)?.ValidTo ?? DateTime.MinValue;
            authData.RefreshTokenExpiryTime = DateTime.UtcNow.AddDays(1);
            authData.Id = entity.Id;

            var identityResult = await _userManager.CreateAsync(entity, model.Password);

            if (!identityResult.Succeeded)
            {
                return(new JsonAPIResult(_apiResult.CreateVMWithIdentityErrors(errors: identityResult.Errors),
                                         StatusCodes.Status422UnprocessableEntity));
            }

            TimeSpan expiryTimeSpan = TimeSpan.FromSeconds(_tokenService.GetTokenExpiryDuration());
            var      cacheResult    = _tokenService.Redis.Insert(authData, expiryTimeSpan);

            if (!cacheResult.IsSuccessful)
            {
                return(new JsonAPIResult(_apiResult.CreateVMWithStatusCode(null, false, APIStatusCode.ERR01011),
                                         StatusCodes.Status409Conflict));
            }

            await _signInManager.SignInAsync(entity, isPersistent : false);

            UserAuthenticationVM returnVM = new UserAuthenticationVM();

            returnVM           = _mapper.Map <User, UserAuthenticationVM>(entity);
            returnVM.TokenData = authData;

            return(new JsonAPIResult(_apiResult.CreateVMWithRec <UserAuthenticationVM>(returnVM, entity.Id, true),
                                     StatusCodes.Status201Created));
        }
示例#3
0
        public async Task <JsonResult> Update([FromRoute] Guid id, [FromBody] UserUpdateVM model)
        {
            if (id.IsEmptyGuid())
            {
                return(new JsonAPIResult(_apiResult.CreateVMWithStatusCode(null, false, APIStatusCode.ERR01003),
                                         StatusCodes.Status400BadRequest));
            }
            else if (!ModelState.IsValid)
            {
                return(new JsonAPIResult(_apiResult.CreateVMWithModelState(modelStateDictionary: ModelState),
                                         StatusCodes.Status400BadRequest));
            }

            var currentUser = await _userManager.FindByNameAsync(User.Identity.Name);

            if (currentUser == null)
            {
                return(new JsonAPIResult(_apiResult.CreateVMWithStatusCode(null, false, APIStatusCode.ERR01004),
                                         StatusCodes.Status404NotFound));
            }

            var user = await _userManager.FindByIdAsync(id.ToString());

            if (user == null)
            {
                return(new JsonAPIResult(_apiResult.CreateVMWithStatusCode(null, false, APIStatusCode.ERR01004),
                                         StatusCodes.Status404NotFound));
            }

            if (currentUser.Id != user.Id)
            {
                return(new JsonAPIResult(_apiResult.CreateVMWithStatusCode(null, false, APIStatusCode.ERR01007),
                                         StatusCodes.Status403Forbidden));
            }

            user.About       = model.About;
            user.DisplayName = model.DisplayName;

            IdentityResult result;

            result = await _userManager.UpdateAsync(user);

            if (!result.Succeeded)
            {
                return(new JsonAPIResult(_apiResult.CreateVMWithStatusCode(null, false, APIStatusCode.ERR01010),
                                         StatusCodes.Status422UnprocessableEntity));
            }

            return(new JsonAPIResult(_apiResult.CreateVM(user.Id, true), StatusCodes.Status200OK));
        }
        public async Task <JsonResult> Create([FromBody] UserLoginVM model)
        {
            if (!ModelState.IsValid)
            {
                return(new JsonAPIResult(_apiResult.CreateVMWithModelState(modelStateDictionary: ModelState),
                                         StatusCodes.Status400BadRequest));
            }

            var loginResult = await _signInManager.PasswordSignInAsync(model.UserName, model.Password,
                                                                       isPersistent : false, lockoutOnFailure : false);

            if (!loginResult.Succeeded)
            {
                return(new JsonAPIResult(_apiResult.CreateVMWithStatusCode(null, false, APIStatusCode.ERR01004),
                                         StatusCodes.Status404NotFound));
            }

            TimeSpan expiryTimeSpan;
            var      user = await _userManager.FindByNameAsync(model.UserName);

            var authData = _tokenService.Redis.GetById(user.Id);

            if (!authData.IsNull() && !authData.Id.IsEmptyGuid())
            {
                return(new JsonAPIResult(_apiResult.CreateVMWithStatusCode(statusCode: APIStatusCode.ERR02025),
                                         StatusCodes.Status400BadRequest));
            }

            if (authData == null || authData.AccessToken.IsNullOrEmptyString() || authData.AccessTokenExpiryTime < DateTime.UtcNow)
            {
                authData = new ViewModel.Auth.TokenCacheVM();

                var claims = new Claim[] {
                    new Claim(JwtRegisteredClaimNames.Sub, user.Id.ToString()),
                    new Claim(JwtRegisteredClaimNames.UniqueName, user.UserName),
                    new Claim("UserId", user.Id.ToString())
                };

                authData.AccessToken            = _tokenService.GenerateAccessToken(claims);
                authData.AccessTokenExpiryTime  = new JwtSecurityTokenHandler().ReadToken(authData.AccessToken)?.ValidTo ?? DateTime.MinValue;
                authData.RefreshToken           = _tokenService.GenerateRefreshToken();
                authData.RefreshTokenExpiryTime = DateTime.UtcNow.AddDays(1);
                authData.Id = user.Id;

                expiryTimeSpan = TimeSpan.FromTicks(authData.AccessTokenExpiryTime.Ticks - DateTime.UtcNow.Ticks);
            }
            else
            {
                expiryTimeSpan = TimeSpan.FromSeconds(_tokenService.GetTokenExpiryDuration());
            }

            var updateResult = _tokenService.Redis.Insert(authData, expiryTimeSpan);

            if (!updateResult.IsSuccessful)
            {
                return(new JsonAPIResult(_apiResult.CreateVMWithStatusCode(null, false, APIStatusCode.ERR01011),
                                         StatusCodes.Status409Conflict));
            }

            var returnVM = _mapper.Map <Domain.User, UserAuthenticationVM>(user);

            returnVM.TokenData = authData;

            SentrySdk.CaptureMessage($"User {user.UserName} is created an access token", SentryLevel.Info);
            return(new JsonAPIResult(returnVM, StatusCodes.Status200OK));
        }