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");
 | 
						||
        }
 | 
						||
    }
 | 
						||
}
 |