From 620a398f4779aecd731250f67b5d7a0ae8522d4c Mon Sep 17 00:00:00 2001 From: milimoe Date: Fri, 11 Jul 2025 00:57:23 +0800 Subject: [PATCH] =?UTF-8?q?=E9=98=B2=E6=AD=A2=E8=87=AA=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=20Bearer=20=E8=A2=AB=E4=B8=AD=E9=97=B4=E4=BB=B6=E6=8B=A6?= =?UTF-8?q?=E6=88=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JwtAuthenticationMiddleware.cs | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/FunGame.WebAPI/Architecture/JwtAuthenticationMiddleware.cs b/FunGame.WebAPI/Architecture/JwtAuthenticationMiddleware.cs index 2036921..ac35dbd 100644 --- a/FunGame.WebAPI/Architecture/JwtAuthenticationMiddleware.cs +++ b/FunGame.WebAPI/Architecture/JwtAuthenticationMiddleware.cs @@ -1,4 +1,5 @@ -using Milimoe.FunGame.WebAPI.Services; +using Microsoft.AspNetCore.Authorization; +using Milimoe.FunGame.WebAPI.Services; namespace Milimoe.FunGame.WebAPI.Architecture { @@ -11,12 +12,33 @@ namespace Milimoe.FunGame.WebAPI.Architecture // 获取 JWT Token string token = context.Request.Headers.Authorization.ToString().Replace("Bearer ", ""); + if (token == "") + { + await next(context); + return; + } + + // 如果存在 Authorize 属性且指定了 CustomBearer 认证方案,跳过 JWT 吊销检查 + Endpoint? endpoint = context.GetEndpoint(); + IReadOnlyList? authorizeAttributes = endpoint?.Metadata.GetOrderedMetadata(); + if (authorizeAttributes != null) + { + foreach (AuthorizeAttribute authorizeAttribute in authorizeAttributes) + { + if (authorizeAttribute.AuthenticationSchemes == "APIBearer" || authorizeAttribute.AuthenticationSchemes == "CustomBearer") + { + await next(context); + return; + } + } + } + // 检查 JWT 是否被吊销 if (jwtService.IsTokenRevoked(token)) { context.Response.StatusCode = StatusCodes.Status401Unauthorized; context.Response.ContentType = "application/json"; - await context.Response.WriteAsync("{\"message\":\"此 Token 已吊销,请重新登录以获取 Token。\"}"); + await context.Response.WriteAsync("{\"message\":\"此 Token 无效或已吊销,请重新登录以获取 Token。\"}"); return; }