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

Angular与.NET Core中WebSocket的JWT令牌授权验证问题

解决.NET Core WebSocket的JWT授权验证问题

问题根源在于默认的JwtBearer中间件只会解析Authorization请求头中的Bearer <token>格式令牌,而你的客户端是将token放在URL查询参数中,导致认证中间件无法识别令牌,进而授权失败。

解决方案:扩展JwtBearer中间件支持查询参数token

修改你的AddJwtBearer配置,添加OnMessageReceived事件处理,从URL查询参数中提取token:

builder.Services.AddAuthentication(x =>
{
    x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(x =>
{
    x.RequireHttpsMetadata = false;
    x.SaveToken = true;
    x.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(base64Secret)),
        ValidateIssuer = false,
        ValidateAudience = false
    };
    // 新增:从查询参数读取token
    x.Events = new JwtBearerEvents
    {
        OnMessageReceived = context =>
        {
            var token = context.Request.Query["token"];
            if (!string.IsNullOrEmpty(token))
            {
                context.Token = token;
            }
            return Task.CompletedTask;
        }
    };
});

原理说明

WebSocket的连接建立依赖HTTP握手请求,RequireAuthorization会触发认证流程。通过OnMessageReceived事件,我们告诉JwtBearer中间件:如果请求的查询参数中存在token字段,就用这个值作为认证令牌。这样中间件就能完成令牌验证,授权策略也能正常生效。

额外建议

  • 生产环境务必使用HTTPS传输,避免token在网络中明文暴露。
  • 如果想更规范地传递token,可尝试自定义WebSocket握手逻辑(比如用HttpClient先发送带Authorization头的请求,再升级连接),但实现复杂度更高,查询参数是更简洁的方案。

内容的提问来源于stack exchange,提问作者Anonymous

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 04:46:03