using Domain.Identity; using Infrastructure; using Microsoft.Extensions.Configuration; using Microsoft.IdentityModel.Tokens; using Models.Identity; using System; using System.Collections.Generic; using System.IdentityModel.Tokens.Jwt; using System.Linq; using System.Security.Claims; using System.Text; namespace Services.Identity { public class TokenIssuer : ITokenIssuer { private readonly IConfiguration _configuration; public TokenIssuer(IConfiguration configuration) { _configuration = configuration; } public JwtSecurityToken Issue(Account user) { var secret = _configuration.GetSection("Jwt").GetSection("Key").Value; var issuer = _configuration.GetSection("Jwt").GetSection("Issuer").Value; var claims = GetTokenClaims(user); return new JwtSecurityToken( issuer: issuer, audience: issuer, claims: claims, expires: DateTime.Now.AddDays(30), signingCredentials: new SigningCredentials(new SymmetricSecurityKey(Encoding.ASCII.GetBytes(secret)), SecurityAlgorithms.HmacSha256) ); } public PlainToken IssuePlainToken(Account user) { var token = Issue(user); return new PlainToken { AccessToken = new JwtSecurityTokenHandler().WriteToken(token), ExpirationDate = token.ValidTo.ConvertToTimestamp() }; } private static IEnumerable GetTokenClaims(Account user) { yield return new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()); yield return new Claim(ClaimTypes.Name, user.Username); yield return new Claim(ClaimTypes.NameIdentifier, "" + user.Id); if(user.AccountRoles != null) foreach (var role in user.AccountRoles) { yield return new Claim(ClaimTypes.Role, role.Role.Name); } yield return new Claim(ITokenIssuer.Claims.Name, user.Name ?? ""); yield return new Claim(ITokenIssuer.Claims.Id, "" + user.Id); yield return new Claim(ITokenIssuer.Claims.Username, user.Username ?? ""); } } public interface ITokenIssuer { public static class Claims { public static readonly string Id = "Id"; public static readonly string Username = "Username"; public static readonly string Name = "Name"; } JwtSecurityToken Issue(Account user); PlainToken IssuePlainToken(Account user); } }