| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 | using System.IdentityModel.Tokens.Jwt;using System.Security.Claims;namespace OASystem.API.OAMethodLib.Auth{    /// <summary>    /// jwt    /// </summary>    public static class JWTBearer    {        public static readonly SymmetricSecurityKey SecurityKey = new SymmetricSecurityKey(Guid.NewGuid().ToByteArray());        public static readonly JwtSecurityTokenHandler JwtTokenHandler = new JwtSecurityTokenHandler();        public static string GenerateToken(HttpContext httpContext)        {            // 请求时传入的用户参数为NameIdentifier claim的值            var claims = new[] {                new Claim(ClaimTypes.NameIdentifier, httpContext.Request.Query["user"])            };            // 签名凭据            var credentials = new SigningCredentials(SecurityKey, SecurityAlgorithms.HmacSha256);            // 生成JWT Token            var token = new JwtSecurityToken("FMGJ-OA", "OA-Users", claims, expires: DateTime.UtcNow.AddSeconds(60), signingCredentials: credentials);            return JwtTokenHandler.WriteToken(token);        }        public static void AddMyJWTBearerAuth(this IServiceCollection services)        {            // 添加自定义授权            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)                .AddJwtBearer(options =>                {                    options.TokenValidationParameters =                    new TokenValidationParameters                    {                        LifetimeValidator = (before, expires, token, parameters) => expires > DateTime.UtcNow,                        ValidateAudience = false,                        ValidateIssuer = false,                        ValidateActor = false,                        ValidateLifetime = true,                        IssuerSigningKey = JWTBearer.SecurityKey                    };                    options.Events = new JwtBearerEvents                    {                        OnMessageReceived = context =>                        {                            // 当我们收到消息时,去获取请求中的access_token字段                            var accessToken = context.Request.Query["access_token"];                            // 如果没有就去头上找,找到了就放入我们context.token中                            if (!string.IsNullOrEmpty(accessToken))                            {                                context.Token = accessToken;                            }                            return Task.CompletedTask;                        }                    };                });        }    }}
 |