JwtTokenManager.cs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using Microsoft.AspNetCore.Identity;
  2. using Microsoft.AspNetCore.WebUtilities;
  3. using Microsoft.Extensions.Options;
  4. using Microsoft.IdentityModel.Tokens;
  5. using System.IdentityModel.Tokens.Jwt;
  6. using System.Security.Claims;
  7. using System.Text;
  8. using WebApp.Common.Configurations;
  9. using WebApp.Common.Exceptions.ClientSide;
  10. using WebApp.Data.Entities;
  11. using WebApp.Services.Interfaces;
  12. namespace WebApp.Services.Implementations;
  13. public class JwtTokenManager : IJwtTokenManager
  14. {
  15. private readonly JwtTokenSettings _jwtTokenSettings;
  16. private readonly UserManager<ApplicationUser> _userManager;
  17. public JwtTokenManager(IOptions<JwtTokenSettings> options, UserManager<ApplicationUser> userManager)
  18. {
  19. _jwtTokenSettings = options.Value;
  20. _userManager = userManager;
  21. }
  22. public async Task<string> GenerateJwtTokenAsync(ApplicationUser user)
  23. {
  24. JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler();
  25. byte[] key = Encoding.ASCII.GetBytes(_jwtTokenSettings.Key);
  26. IList<string> roles = await _userManager.GetRolesAsync(user);
  27. IList<Claim> userClaims =
  28. [
  29. new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
  30. new Claim(ClaimTypes.Name, user.UserName!),
  31. new Claim(ClaimTypes.Email, user.Email!)
  32. ];
  33. foreach (string role in roles)
  34. {
  35. userClaims.Add(new Claim(ClaimTypes.Role, role));
  36. }
  37. JwtSecurityToken token = new(
  38. issuer: _jwtTokenSettings.Issuer,
  39. audience: _jwtTokenSettings.Audience,
  40. claims: userClaims,
  41. expires: DateTime.Now.AddDays(1),
  42. signingCredentials: new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature));
  43. return tokenHandler.WriteToken(token);
  44. }
  45. public async Task<string> GenerateConfirmEmailTokenAsync(ApplicationUser user)
  46. {
  47. string confirmEmailToken = await _userManager.GenerateEmailConfirmationTokenAsync(user);
  48. confirmEmailToken = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(confirmEmailToken));
  49. return confirmEmailToken;
  50. }
  51. public async Task<string> GenerateForgetPasswordTokenAsync(ApplicationUser user)
  52. {
  53. string resetPasswordToken = await _userManager.GeneratePasswordResetTokenAsync(user);
  54. resetPasswordToken = WebEncoders.Base64UrlEncode(Encoding.UTF8.GetBytes(resetPasswordToken));
  55. return resetPasswordToken;
  56. }
  57. }