25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

78 lines
2.6 KiB

  1. using Domain.Identity;
  2. using Infrastructure;
  3. using Microsoft.Extensions.Configuration;
  4. using Microsoft.IdentityModel.Tokens;
  5. using Models.Identity;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.IdentityModel.Tokens.Jwt;
  9. using System.Linq;
  10. using System.Security.Claims;
  11. using System.Text;
  12. namespace Services.Identity
  13. {
  14. public class TokenIssuer : ITokenIssuer
  15. {
  16. private readonly IConfiguration _configuration;
  17. public TokenIssuer(IConfiguration configuration)
  18. {
  19. _configuration = configuration;
  20. }
  21. public JwtSecurityToken Issue(Account user)
  22. {
  23. var secret = _configuration.GetSection("Jwt").GetSection("Key").Value;
  24. var issuer = _configuration.GetSection("Jwt").GetSection("Issuer").Value;
  25. var claims = GetTokenClaims(user);
  26. return new JwtSecurityToken(
  27. issuer: issuer,
  28. audience: issuer,
  29. claims: claims,
  30. expires: DateTime.Now.AddDays(30),
  31. signingCredentials: new SigningCredentials(new SymmetricSecurityKey(Encoding.ASCII.GetBytes(secret)), SecurityAlgorithms.HmacSha256)
  32. );
  33. }
  34. public PlainToken IssuePlainToken(Account user)
  35. {
  36. var token = Issue(user);
  37. return new PlainToken
  38. {
  39. AccessToken = new JwtSecurityTokenHandler().WriteToken(token),
  40. ExpirationDate = token.ValidTo.ConvertToTimestamp()
  41. };
  42. }
  43. private static IEnumerable<Claim> GetTokenClaims(Account user)
  44. {
  45. yield return new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString());
  46. yield return new Claim(ClaimTypes.Name, user.Username);
  47. yield return new Claim(ClaimTypes.NameIdentifier, "" + user.Id);
  48. if(user.AccountRoles != null)
  49. foreach (var role in user.AccountRoles)
  50. {
  51. yield return new Claim(ClaimTypes.Role, role.Role.Name);
  52. }
  53. yield return new Claim(ITokenIssuer.Claims.Name, user.Name ?? "");
  54. yield return new Claim(ITokenIssuer.Claims.Id, "" + user.Id);
  55. yield return new Claim(ITokenIssuer.Claims.Username, user.Username ?? "");
  56. }
  57. }
  58. public interface ITokenIssuer
  59. {
  60. public static class Claims
  61. {
  62. public static readonly string Id = "Id";
  63. public static readonly string Username = "Username";
  64. public static readonly string Name = "Name";
  65. }
  66. JwtSecurityToken Issue(Account user);
  67. PlainToken IssuePlainToken(Account user);
  68. }
  69. }