Esempio n. 1
0
        public async Task <SessionOutDto> Login(SessionCreateInDto loginParams)
        {
            #region login_user_if_existed_check

            var user = await _context.Users
                       .Include(u => u.UserRoleAssociations)
                       .ThenInclude(a => a.Role)
                       .FirstOrDefaultAsync(u => u.Name == loginParams.Name);

            if (user == null)
            {
                throw new NotExistedException();
            }

            #endregion

            #region login_user_password_check

            if (!ValidatePassword(user, loginParams.Password))
            {
                throw new BadAuthenticationException();
            }

            #endregion

            #region login_generate_jwt_bearer_token

            var roles       = (from association in user.UserRoleAssociations select association.Role).ToList();
            var permissions = await _permissionService.Filter(new PermissionFilterInDto
            {
                RoleIds = roles.Select(r => r.Id).ToList(),
            });

            var claims = new List <Claim>
            {
                new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
                new Claim(ClaimTypes.Name, user.Name),
                new Claim(ClaimTypes.Expiration,
                          DateTime.Now.AddSeconds(_authenticationService.ExpirationTime.TotalSeconds).ToString())
            };
            claims.AddRange(roles.Select(r => new Claim(ClaimTypes.Role, r.Name)));
            claims.AddRange(permissions.Select(p => new Claim(ClaimTypes.AuthorizationDecision, p.Name)));
            var token = _authenticationService.BuildJwtToken(claims);


            #endregion

            #region update_last_activate_info

            _context.Entry(user).State = EntityState.Modified;
            user.UpdateTime            = DateTime.Now;
            await _context.SaveChangesAsync();

            #endregion

            return(new SessionOutDto {
                User = user, Token = token
            });
        }
Esempio n. 2
0
        public async Task <ActionResult <ResultOutDto <object> > > CreateSession([FromBody] SessionCreateInDto createOptions)
        {
            try
            {
                var token = await _userService.Login(createOptions);

                return(Ok(ResultOutDtoBuilder.Success(token)));
            }
            catch (NotExistedException e)
            {
                return(NotFound(
                           ResultOutDtoBuilder
                           .Fail <object>(e, "Target user not exist.")
                           ));
            }
            catch (BadAuthenticationException e)
            {
                return(Unauthorized(
                           ResultOutDtoBuilder
                           .Fail <object>(e, "User name and password don't match.")
                           ));
            }
        }