using System; using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Text; using System.Threading.Tasks; //JWT秘钥生成接口 namespace SignUp.Common.JWT { public interface ITokenService { string BuildToken(IEnumerable<Claim> claims, JWTOptions options); } } //实现JWT接口 using Microsoft.IdentityModel.Tokens; using SignUp.Common.Extensions; using System; using System.Collections.Generic; using System.IdentityModel.Tokens.Jwt; using System.Linq; using System.Security.Claims; using System.Text; using System.Threading.Tasks; namespace SignUp.Common.JWT { public class TokenService : ITokenService { /// <summary> /// 生成JWT /// </summary> /// <param name="claims"></param> /// <param name="options"></param> /// <returns></returns> public string BuildToken(IEnumerable<Claim> claims, JWTOptions options) { TimeSpan ExpiryDuration = TimeSpan.FromSeconds(options.ExpireSeconds); var securityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(options.SecKey)); var credentials = new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256Signature); var tokenDescriptor = new JwtSecurityToken(options.Issuer, options.Audience, claims, expires: DateTime.Now.Add(ExpiryDuration), signingCredentials: credentials); return new JwtSecurityTokenHandler().WriteToken(tokenDescriptor); } /// <summary> /// 获取过期时间 /// </summary> /// <param name="jwtStr"></param> /// <returns></returns> public static DateTime GetExp( string jwtStr) { var jwtHandler = new JwtSecurityTokenHandler(); JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(jwtStr); DateTime expDate = (jwtToken.Payload[JwtRegisteredClaimNames.Exp] ?? 0).GetInt().GetTimeSpmpToDate(); return expDate; } public static bool IsExp( string jwtStr) { return GetExp(jwtStr) < DateTime.Now; } } } //JWT配置参数类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SignUp.Common.JWT { public class JWTOptions { /// <summary> /// JWT Issuer /// </summary> public string Issuer { get ; set ; } /// <summary> /// JWT Audience /// </summary> public string Audience { get ; set ; } /// <summary> /// JWT SecKey /// </summary> public string SecKey { get ; set ; } /// <summary> /// JWT 过期时间 /// </summary> public int ExpireSeconds { get ; set ; } } } //注册服务 using Microsoft.Extensions.DependencyInjection; using SignUp.Common.Commons; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SignUp.Common.JWT { class ModuleInitializer : IModuleInitializer { public void Initialize(IServiceCollection services) { services.AddScoped<ITokenService, TokenService>(); } } } |