+JWT Service
+public interface IJwtService
+{
+ string GenerateToken(User user);
+ bool ValidateToken(string token);
+}
+
+public class JwtService : IJwtService
+{
+ private readonly IConfiguration _configuration;
+
+ public JwtService(IConfiguration configuration)
+ {
+ _configuration = configuration;
+ }
+
+ public string GenerateToken(User user)
+ {
+ var jwtSettings = _configuration.GetSection("JwtSettings");
+ var secretKey = Encoding.ASCII.GetBytes(jwtSettings["SecretKey"]);
+
+ var tokenHandler = new JwtSecurityTokenHandler();
+ var tokenDescriptor = new SecurityTokenDescriptor
+ {
+ Subject = new ClaimsIdentity(new[]
+ {
+ new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
+ new Claim(ClaimTypes.Name, user.Username),
+ new Claim(ClaimTypes.Email, user.Email),
+ new Claim(ClaimTypes.Role, user.Role)
+ }),
+ Expires = DateTime.UtcNow.AddMinutes(
+ Convert.ToDouble(jwtSettings["ExpirationInMinutes"])
+ ),
+ Issuer = jwtSettings["Issuer"],
+ Audience = jwtSettings["Audience"],
+ SigningCredentials = new SigningCredentials(
+ new SymmetricSecurityKey(secretKey),
+ SecurityAlgorithms.HmacSha256Signature
+ )
+ };
+
+ var token = tokenHandler.CreateToken(tokenDescriptor);
+ return tokenHandler.WriteToken(token);
+ }
+
+ public bool ValidateToken(string token)
+ {
+ var jwtSettings = _configuration.GetSection("JwtSettings");
+ var secretKey = Encoding.ASCII.GetBytes(jwtSettings["SecretKey"]);
+
+ var tokenHandler = new JwtSecurityTokenHandler();
+ try
+ {
+ tokenHandler.ValidateToken(token, new TokenValidationParameters
+ {
+ ValidateIssuerSigningKey = true,
+ IssuerSigningKey = new SymmetricSecurityKey(secretKey),
+ ValidateIssuer = true,
+ ValidIssuer = jwtSettings["Issuer"],
+ ValidateAudience = true,
+ ValidAudience = jwtSettings["Audience"],
+ ValidateLifetime = true,
+ ClockSkew = TimeSpan.Zero
+ }, out SecurityToken validatedToken);
+
+ return true;
+ }
+ catch
+ {
+ return false;
+ }
+ }
+}
+
+
+