You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 15:43:12