C# Web API添加API Key认证无效问题排查求助
问题排查与解决方案
1. 控制器基类错误
你的控制器继承了ApiController,但ASP.NET Core Web API的标准控制器基类是ControllerBase。如果ApiController是自定义类,未正确继承ControllerBase会导致Action过滤器特性无法被框架识别。
修改控制器代码:
[ApiController] [APIKeyAuth] public class MyStudentController : ControllerBase { // 你的控制器逻辑 }
2. API Key比较逻辑错误
Request.Headers.TryGetValue返回的potentialAPIKey是StringValues类型(支持多值表头),直接与string类型的apiKey用Equals比较会因对象类型不匹配导致逻辑错误。需要提取表头的第一个值再做比较:
修改APIKeyAuthAttribute中的比较逻辑:
if (!apiKey.Equals(potentialAPIKey.FirstOrDefault(), StringComparison.OrdinalIgnoreCase)) { context.Result = new ContentResult { StatusCode = 401, Content = "Unauthorized Client." }; return; }
3. 确认控制器服务已注册
在Program.cs中确保已添加控制器服务并映射端点,否则控制器及附加的过滤器不会被框架加载:
var builder = WebApplication.CreateBuilder(args); // 添加控制器服务 builder.Services.AddControllers(); var app = builder.Build(); app.UseHttpsRedirection(); app.UseAuthorization(); // 映射控制器端点 app.MapControllers(); app.Run();
4. 验证配置读取是否正确
可以在过滤器中添加日志,确认从appsettings.json中读取的MyApiKey是否正确:
var logger = context.HttpContext.RequestServices.GetRequiredService<ILogger<APIKeyAuthAttribute>>(); logger.LogInformation("Configured API Key: {ApiKey}", apiKey);
启动API后查看日志,确保读取到的Key与配置文件中的值一致。
5. 检查Postman请求配置
- 确认请求表头的键是
MyApiKey(代码中是精确匹配,建议与配置保持大小写一致) - 关闭Postman中其他自动认证方式(如Bearer Token),避免请求被意外放行
内容的提问来源于stack exchange,提问作者GBM
相关产品推荐
相关产品推荐

