ASP.NET Core 6.0 Web API如何接收authorization请求头参数?
问题原因
ASP.NET Core默认的认证中间件会自动处理Authorization请求头,处理完成后会将其从请求头集合中移除,导致控制器通过[FromHeader]无法获取到该字段。
解决方案
方法1:配置认证中间件保留Authorization头
在Program.cs中配置认证服务时,设置SkipAuthorizationHeaderHandling = true,让认证中间件不处理(不移除)Authorization头:
builder.Services.AddAuthentication("Bearer") // 替换为你的实际认证方案 .AddJwtBearer(options => { options.SkipAuthorizationHeaderHandling = true; // 保留原有的认证配置(如TokenValidationParameters等) });
设置完成后,Authorization头会保留在请求头集合中,控制器中的[FromHeader] string authorization就能正常接收参数。
方法2:通过HttpContext.Items传递Authorization头(适配自定义AuthenticationHandler场景)
如果使用自定义AuthenticationHandler,可以在认证逻辑中把Authorization头存入HttpContext.Items,再在控制器中读取:
- 修改自定义Handler:
protected override async Task<AuthenticateResult> HandleAuthenticateAsync() { var authHeader = Request.Headers.Authorization.ToString(); // 将头信息存入Items Context.Items["AuthHeader"] = authHeader; // 你的认证逻辑(验证令牌、生成ClaimsIdentity等) var claims = new List<Claim> { new Claim(ClaimTypes.Name, "test") }; var identity = new ClaimsIdentity(claims, Scheme.Name); var ticket = new AuthenticationTicket(new ClaimsPrincipal(identity), Scheme.Name); return AuthenticateResult.Success(ticket); }
- 在控制器中读取:
public virtual IActionResult GetStatus([FromRoute][Required] string requestId) { if (HttpContext.Items.TryGetValue("AuthHeader", out var authObj) && authObj is string authorization) { // 使用authorization参数 } else { return BadRequest("缺少Authorization请求头"); } // 其他业务逻辑 return Ok(); }
方法3:调整中间件顺序(查看原始请求头)
如果你的自定义中间件需要查看原始Authorization头,确保该中间件注册在认证中间件之前:
// 自定义中间件放在认证中间件之前 app.UseMiddleware<YourCustomMiddleware>(); app.UseAuthentication(); app.UseAuthorization();
这样自定义中间件就能在认证中间件处理前获取到Authorization头。
内容的提问来源于stack exchange,提问作者user1562696
相关产品推荐
相关产品推荐

