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

C# ASP.NET Core 3.1 API如何验证外部服务JWT并解决Bearer认证401问题

问题原因

你当前返回401的核心原因是默认的JwtBearer中间件会强制校验JWT的签名有效性,你既没有配置签发密钥,也没有调整校验规则,所有请求都会直接被拦截返回401。

前置风险提示

注意:JWT的签名校验是保证令牌未被篡改的核心机制,跳过签名校验存在极高安全风险,攻击者可随意构造payload内容伪造合法令牌,该方案仅建议在测试环境、网络完全隔离的内部服务场景下使用。生产环境优先找服务A提供方获取签名公钥(非对称加密场景)或令牌校验接口,再做合法性校验。

无需自研整套认证的配置方案

你可以直接调整JwtBearer的校验参数,跳过签名校验,仅校验payload内的已知字段,直接在Startup的ConfigureServices中修改配置即可:

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            // 关闭签名校验(仅无密钥场景临时使用)
            ValidateIssuerSigningKey = false,
            RequireSignedTokens = false,
            // 开启issuer校验,填入你已知的合法issuer值
            ValidateIssuer = true,
            ValidIssuer = "http://localhost.com",
            // 若需要校验受众audience则开启,不需要可设为false
            ValidateAudience = false,
            // 若需要校验令牌有效期则开启
            ValidateLifetime = true,
            // 时间偏移量,设置为0代表不允许任何过期时间误差
            ClockSkew = TimeSpan.Zero
        };
        options.Events = new JwtBearerEvents
        {
            OnMessageReceived = context =>
            {
                var accessToken = context.Request.Headers["Authorization"].FirstOrDefault()?.Split(" ")?.Last() ?? string.Empty;
                if (!string.IsNullOrEmpty(accessToken))
                    context.Token = accessToken;
                return Task.CompletedTask;
            },
            // 若需要添加额外的自定义payload校验逻辑,可添加该事件
            OnTokenValidated = context =>
            {
                // 示例:校验payload中的name字段是否符合预期
                var nameClaim = context.Principal?.Claims.FirstOrDefault(c => c.Type == "name")?.Value;
                if (nameClaim != "John Doe")
                {
                    context.Fail("令牌字段非法");
                }
                return Task.CompletedTask;
            }
        };
    });

额外注意事项

需要确保在Startup.Configure方法中按顺序添加了认证和授权中间件,顺序错误也会导致401:

app.UseRouting();
// 先加认证,再加授权
app.UseAuthentication();
app.UseAuthorization();

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();
});

完成以上配置后,你控制器上现有的[Authorize(AuthenticationSchemes = "Bearer")]注解即可正常生效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:33:00