46 lines
1.5 KiB
C#
46 lines
1.5 KiB
C#
using System.IdentityModel.Tokens.Jwt;
|
|
using System.Security.Claims;
|
|
using System.Text;
|
|
using Microsoft.Extensions.Configuration;
|
|
using Microsoft.IdentityModel.Tokens;
|
|
using Knot.Modules.Identity.Application.Abstractions;
|
|
using Knot.Modules.Identity.Domain;
|
|
|
|
namespace Knot.Modules.Identity.Infrastructure.Authentication;
|
|
|
|
public sealed class JwtTokenProvider : IJwtTokenProvider
|
|
{
|
|
private readonly IConfiguration _configuration;
|
|
|
|
public JwtTokenProvider(IConfiguration configuration)
|
|
{
|
|
_configuration = configuration;
|
|
}
|
|
|
|
public string Generate(User user)
|
|
{
|
|
var claims = new Claim[]
|
|
{
|
|
new(JwtRegisteredClaimNames.Sub, user.Id.ToString()),
|
|
new(JwtRegisteredClaimNames.UniqueName, user.Username),
|
|
new("name", user.DisplayName),
|
|
new(ClaimTypes.Name, user.DisplayName),
|
|
new("avatar", user.Avatar ?? string.Empty)
|
|
};
|
|
|
|
var secretKey = _configuration["Jwt:Secret"]!;
|
|
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey));
|
|
var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
|
|
|
|
var token = new JwtSecurityToken(
|
|
_configuration["Jwt:Issuer"],
|
|
_configuration["Jwt:Audience"],
|
|
claims,
|
|
null,
|
|
DateTime.UtcNow.AddMinutes(double.Parse(_configuration["Jwt:ExpiryInMinutes"] ?? "1440")),
|
|
credentials);
|
|
|
|
return new JwtSecurityTokenHandler().WriteToken(token);
|
|
}
|
|
}
|