66 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C#
		
	
	
	
		
		
			
		
	
	
			66 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C#
		
	
	
	
| 
								 | 
							
								using LY.App.Common.Redis;
							 | 
						|||
| 
								 | 
							
								using StackExchange.Redis;
							 | 
						|||
| 
								 | 
							
								using System.IdentityModel.Tokens.Jwt;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								namespace LY.App.MiddleWare
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
								    public class TokenValidationMiddleware : IMiddleware
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								        private RedisService _redis;
							 | 
						|||
| 
								 | 
							
								        public TokenValidationMiddleware(RedisService redisHelper)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            _redis = redisHelper;
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        public async Task InvokeAsync(HttpContext context, RequestDelegate next)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            // 排除不需要Token验证的API
							 | 
						|||
| 
								 | 
							
								            if (IsExcludedPath(context.Request.Path))
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                await next(context);
							 | 
						|||
| 
								 | 
							
								                return;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            // 获取Token
							 | 
						|||
| 
								 | 
							
								            var token = context.Request.Headers["Authorization"].ToString().Replace("Bearer ", "");
							 | 
						|||
| 
								 | 
							
								            if (!string.IsNullOrEmpty(token))
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                // 验证Token是否有效
							 | 
						|||
| 
								 | 
							
								                var handler = new JwtSecurityTokenHandler();
							 | 
						|||
| 
								 | 
							
								                var jsonToken = handler.ReadToken(token) as JwtSecurityToken;
							 | 
						|||
| 
								 | 
							
								                if (jsonToken != null)
							 | 
						|||
| 
								 | 
							
								                {
							 | 
						|||
| 
								 | 
							
								                    // 从Token中获取数据
							 | 
						|||
| 
								 | 
							
								                    var username = jsonToken.Claims.FirstOrDefault(claim => claim.Type == "sub")?.Value;
							 | 
						|||
| 
								 | 
							
								                    if (username != null)
							 | 
						|||
| 
								 | 
							
								                    {
							 | 
						|||
| 
								 | 
							
								                        if (await _redis.ExistsAsync(RedisKeyList.TokenUser(username)))
							 | 
						|||
| 
								 | 
							
								                        {
							 | 
						|||
| 
								 | 
							
								                            // Token和数据验证通过,继续处理请求
							 | 
						|||
| 
								 | 
							
								                            await next(context);
							 | 
						|||
| 
								 | 
							
								                            return;
							 | 
						|||
| 
								 | 
							
								                        }
							 | 
						|||
| 
								 | 
							
								                    }
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            else
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                // Token不存在,返回未授权
							 | 
						|||
| 
								 | 
							
								                context.Response.StatusCode = 401;
							 | 
						|||
| 
								 | 
							
								                await context.Response.WriteAsync("Unauthorized: Invalid Token");
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								        /// <summary>
							 | 
						|||
| 
								 | 
							
								        /// 这是放不需要过滤的api地址
							 | 
						|||
| 
								 | 
							
								        /// </summary>
							 | 
						|||
| 
								 | 
							
								        /// <param name="path"></param>
							 | 
						|||
| 
								 | 
							
								        /// <returns></returns>
							 | 
						|||
| 
								 | 
							
								        private bool IsExcludedPath(PathString path)
							 | 
						|||
| 
								 | 
							
								        {
							 | 
						|||
| 
								 | 
							
								            // 根据实际情况定义不需要Token验证的API路径
							 | 
						|||
| 
								 | 
							
								            string[] arry = { "login" };
							 | 
						|||
| 
								 | 
							
								            return arry.Any(s => path.Value.Contains(s));
							 | 
						|||
| 
								 | 
							
								            // return path.StartsWithSegments("/api/public");
							 | 
						|||
| 
								 | 
							
								        }
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								}
							 |