52 lines
1.8 KiB
C#
52 lines
1.8 KiB
C#
using System.IdentityModel.Tokens.Jwt;
|
|
using System.Security.Claims;
|
|
|
|
|
|
using Microsoft.IdentityModel.Tokens;
|
|
|
|
namespace Services {
|
|
|
|
public interface IJwtService {
|
|
string CreateJwtToken(IEnumerable<string> issuer, DateTime expires, string userId, string userEmail, string userName, IEnumerable<string> userRoles);
|
|
JwtSecurityToken ReadJwtToken(string token);
|
|
}
|
|
public class JwtService : IJwtService {
|
|
private readonly JwtSecurityTokenHandler _tokenHandler;
|
|
private readonly IJwtServiceSettings _serviceSettings;
|
|
|
|
public JwtService(IJwtServiceSettings serviceSettings) {
|
|
_serviceSettings = serviceSettings;
|
|
_tokenHandler = new JwtSecurityTokenHandler();
|
|
}
|
|
|
|
public string CreateJwtToken(IEnumerable<string> issuer, DateTime expires, string userId, string userEmail, string userName, IEnumerable<string> userRoles) {
|
|
var key = Convert.FromBase64String(_serviceSettings.Secret);
|
|
|
|
// add roles to claims identity from database
|
|
var claims = new List<Claim>() {
|
|
new Claim(ClaimTypes.Actor, userId),
|
|
new Claim(ClaimTypes.Email, userEmail),
|
|
new Claim(ClaimTypes.NameIdentifier, userName),
|
|
// new Claim(ClaimTypes.Webpage, issuer)
|
|
};
|
|
|
|
foreach (var role in userRoles)
|
|
claims.Add(new Claim(ClaimTypes.Role, role));
|
|
|
|
foreach (var iss in issuer)
|
|
claims.Add(new Claim(ClaimTypes.Webpage, iss));
|
|
|
|
var token = _tokenHandler.CreateToken(new SecurityTokenDescriptor {
|
|
IssuedAt = DateTime.UtcNow,
|
|
Subject = new ClaimsIdentity(claims),
|
|
Expires = expires,
|
|
SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha512Signature),
|
|
});
|
|
|
|
return _tokenHandler.WriteToken(token);
|
|
}
|
|
|
|
public JwtSecurityToken ReadJwtToken(string token) => _tokenHandler.ReadJwtToken(token);
|
|
}
|
|
}
|