[feature] 建立鉴权项目结构

This commit is contained in:
lichx
2024-10-30 17:52:22 +08:00
parent 8c019a3159
commit d33ff74a51
23 changed files with 694 additions and 0 deletions
@@ -0,0 +1,54 @@
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using Microsoft.Extensions.Configuration;
using Microsoft.IdentityModel.Tokens;
using SiteManagementSystem_SoftwareEngineering_.Entity;
using SiteManagementSystem_SoftwareEngineering_.Interface;
using SiteManagementSystem_SoftwareEngineering_.Model;
namespace SiteManagementSystem_SoftwareEngineering_.Factory
{
public class TokenFactory(
TokenFactoryConfiguration configuration
) : ITokenFactory
{
private readonly TokenFactoryConfiguration _configuration = configuration;
private string CreateToken(IEnumerable<Claim> claims, User user, DateTime expires)
{
// 为什么把 NameIdentifier 单独写在这儿?
claims = claims.Append(new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()));
var credentials = new SigningCredentials(
new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration.SigningKey)),
SecurityAlgorithms.HmacSha256
);
var token = new JwtSecurityToken(
issuer: _configuration.Issuer,
audience: _configuration.Audience,
notBefore: DateTime.Now,
expires: expires,
claims: claims,
signingCredentials: credentials
);
return new JwtSecurityTokenHandler().WriteToken(token);
}
public string CreateAccessToken(User user)
{
var expires = DateTime.Now.AddMinutes(_configuration.AccessTokenExpire);
return CreateToken(
user.GetUserClaims().Append(new Claim("TokenType", "AccessToken")),
user,
expires
);
}
public string CreateRefreshToken(User user)
{
var expires = DateTime.Now.AddMinutes(_configuration.RefreshTokenExpire);
return CreateToken([new Claim("TokenType", "RefreshToken")], user, expires);
}
}
}