You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

UserService.cs 2.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. namespace Diligent.WebAPI.Business.Services
  2. {
  3. public class UserService : IUserService
  4. {
  5. private readonly AuthorizationSettings _authSettings;
  6. private readonly UserManager<User> _userManager;
  7. private readonly IMapper _mapper;
  8. public UserService(IOptions<AuthorizationSettings> authSettings, UserManager<User> userManager, IMapper mapper)
  9. {
  10. _authSettings = authSettings.Value;
  11. _userManager = userManager;
  12. _mapper = mapper;
  13. }
  14. public async Task<IEnumerable<User?>> GetAll() =>
  15. await _userManager.Users.ToListAsync();
  16. public async Task<User?> GetById(int id) =>
  17. await _userManager.FindByIdAsync(id.ToString());
  18. public async Task CreateUser(CreateUserRequestDto model)
  19. {
  20. var user = _mapper.Map<User>(model);
  21. await _userManager.CreateAsync(user, model.Password);
  22. }
  23. public async Task<AuthenticateResponseDto?> Authenticate(AuthenticateRequestDto model)
  24. {
  25. var user = await _userManager.FindByNameAsync(model.Username);
  26. // return null if user not found
  27. if (user == null)
  28. return null;
  29. var result = await _userManager.CheckPasswordAsync(user, model.Password);
  30. if (!result)
  31. return null;
  32. // authentication successful so generate jwt token
  33. var token = GenerateJwtToken(user);
  34. return new AuthenticateResponseDto
  35. {
  36. Id = user.Id,
  37. Username = user.UserName,
  38. FirstName = user.FirstName,
  39. LastName = user.LastName,
  40. Token = token
  41. };
  42. }
  43. private string GenerateJwtToken(User user)
  44. {
  45. // generate token that is valid for 7 days
  46. var tokenHandler = new JwtSecurityTokenHandler();
  47. var key = Encoding.ASCII.GetBytes(_authSettings.Secret);
  48. var tokenDescriptor = new SecurityTokenDescriptor
  49. {
  50. Subject = new ClaimsIdentity(new[] { new Claim("id", user.Id.ToString()) }),
  51. Expires = DateTime.UtcNow.AddMinutes(2),
  52. SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
  53. };
  54. var token = tokenHandler.CreateToken(tokenDescriptor);
  55. return tokenHandler.WriteToken(token);
  56. }
  57. }
  58. }