为API配置Swagger授权遇异常:未授权请求仍返回200而非401
问题原因与解决方案
你当前的代码仅在Swagger中配置了ApiKey的显示规则和接口要求,但没有添加实际的ApiKey验证逻辑,所以未携带ApiKey的请求不会被拦截,自然返回200状态码。
要实现未授权请求返回401,需要完成以下步骤:
1. 创建ApiKey验证过滤器
添加一个自定义授权过滤器,用于校验请求头中的XApiKey是否有效:
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; public class ApiKeyAuthorizationFilter : IAuthorizationFilter { private const string ApiKeyHeaderName = "XApiKey"; private readonly string _validApiKey; public ApiKeyAuthorizationFilter(IConfiguration configuration) { _validApiKey = configuration.GetValue<string>("ApiKey"); if (string.IsNullOrEmpty(_validApiKey)) { throw new InvalidOperationException("未在配置文件中设置ApiKey"); } } public void OnAuthorization(AuthorizationFilterContext context) { // 检查请求头是否包含XApiKey if (!context.HttpContext.Request.Headers.TryGetValue(ApiKeyHeaderName, out var extractedApiKey)) { context.Result = new UnauthorizedResult(); return; } // 校验ApiKey是否匹配 if (!string.Equals(extractedApiKey, _validApiKey, StringComparison.OrdinalIgnoreCase)) { context.Result = new UnauthorizedResult(); } } }
2. 注册并启用过滤器
在Program.cs中修改AddControllersWithViews的配置,全局启用该过滤器(如果只想给特定控制器/方法启用,可在对应控制器上添加[TypeFilter(typeof(ApiKeyAuthorizationFilter))]特性):
builder.Services.AddControllersWithViews(options => { options.Filters.Add<ApiKeyAuthorizationFilter>(); });
3. 在配置文件中添加ApiKey
在appsettings.json中添加有效的ApiKey配置:
{ "ApiKey": "你的有效ApiKey值" }
完成以上配置后,未携带XApiKey或ApiKey无效的请求就会返回401 Unauthorized状态码,同时Swagger UI的ApiKey输入框依然可以正常使用。
内容的提问来源于stack exchange,提问作者Yardi
相关产品推荐
相关产品推荐

