如何在ASP.NET Core中自定义Header字段传递Bearer Token以避免网关授权冲突
解决自定义Header传递JWT Token避免网关冲突的方案
很简单,你只需要修改JWT认证的配置,让它从自定义的Header字段读取Token,而不是默认的Authorization头。下面是具体的实现步骤:
1. 修改Startup中的JWT认证配置
在AddJwtBearer的配置里,通过Events的OnMessageReceived事件自定义Token的获取逻辑,指定从你想要的Header键读取Token。比如我们用X-API-Token作为自定义Header:
services.AddAuthentication() .AddJwtBearer("ApiBearer", options => { options.Authority = Configuration.GetSection("JwtAuthority").Get<string>(); options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = false, ValidateAudience = false, RequireExpirationTime = false, ValidateLifetime = false, ValidateIssuer = false, }; // 核心:从自定义Header读取Token options.Events = new JwtBearerEvents { OnMessageReceived = context => { // 从X-API-Token头获取Token var token = context.Request.Headers["X-API-Token"].FirstOrDefault(); // 如果你的Token格式是"Bearer xxx",记得去掉前缀(如果需要的话) // if (!string.IsNullOrEmpty(token) && token.StartsWith("Bearer ")) // { // token = token.Substring(7); // } if (!string.IsNullOrEmpty(token)) { context.Token = token; } return Task.CompletedTask; } }; });
这里我把认证方案的名称改成了ApiBearer,这样能更清晰地区分它和网关的Bearer方案,避免混淆。
2. 更新控制器的Authorize属性
把控制器上的Authorize属性指定为我们刚才定义的ApiBearer方案:
[HttpPost] [ApiVersion("1.0")] [ProducesResponseType(typeof(ErrorMessageDto), 500)] [Authorize(AuthenticationSchemes = "ApiBearer")] // 修改这里的Scheme名称 [ProducesResponseType(typeof(NavMenuItemReturnDto), 201)] public IActionResult CreateNavMenuItem(NavMenuItemUpdateCreateDto newNavMenuItem) { try { return StatusCode(201, _navMenuItemsBL.CreateNewNavMenuItem(newNavMenuItem).Result); } catch (Exception ex) { return StatusCode(500, new ErrorMessageDto { Error = ex.Message }); } }
3. 客户端请求时的注意事项
客户端调用接口时,需要在请求头中带上自定义的X-API-Token字段,值为你的JWT Token。比如:
X-API-Token: your-jwt-token-here
如果你的Token原本是带Bearer 前缀的格式,记得要么在客户端发送时去掉前缀,要么在服务器端的OnMessageReceived事件里处理掉(上面代码里有注释说明)。
这样配置后,你的接口就会从自定义Header读取Token进行授权验证,完全避开了网关占用的Authorization头,解决了冲突问题。
内容的提问来源于stack exchange,提问作者Federico Alberti
相关产品推荐
相关产品推荐

