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

如何在.NET Aspire中配置认证?现有应用JWT授权异常求助

解决.NET Aspire集成后JWT授权丢失问题

1. 校验Aspire服务转发的请求头传递逻辑

Aspire默认会传递请求头,但可能因中间件顺序或自定义配置导致Authorization头被拦截。在API项目的Program.cs中,确保Aspire相关中间件位置正确,且无自定义逻辑移除请求头:

var builder = WebApplication.CreateBuilder(args);

// 优先添加Aspire服务发现
builder.AddServiceDiscovery();

// 配置JWT授权
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = builder.Configuration["Jwt:Issuer"],
            ValidAudience = builder.Configuration["Jwt:Audience"],
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]))
        };
    });

builder.Services.AddAuthorization();

var app = builder.Build();

app.UseRouting();
app.UseServiceDiscovery();
// 确保认证中间件在授权前,且无前置中间件移除请求头
app.UseAuthentication();
app.UseAuthorization();

app.MapControllers();
app.Run();

2. 修正Swagger请求根地址配置

Swagger请求根与API实际地址不一致会导致请求发送至错误端点,需调整Swagger的服务器地址配置:

builder.Services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "你的API", Version = "v1" });
});

app.UseSwagger();
app.UseSwaggerUI(c =>
{
    c.SwaggerEndpoint("/swagger/v1/swagger.json", "你的API V1");
    c.RoutePrefix = string.Empty;
    // 强制Swagger使用当前页面的主机地址发送请求,避免跨地址问题
    c.ConfigObject.AdditionalItems["servers"] = new List<OpenApiServer>
    {
        new OpenApiServer { Url = "http://localhost:5085" } // 填写Aspire代理后的API地址
    };
});

3. 验证Aspire服务端点配置

在Aspire AppHost项目中,确认API服务的端点配置无自定义请求头拦截逻辑:

var builder = DistributedApplication.CreateBuilder(args);

var api = builder.AddProject<Projects.YourApi>("yourapi")
    .WithHttpEndpoint(port: 5085, scheme: "http");

builder.AddDashboard();
builder.Build().Run();

4. 调试请求头接收情况

在API项目中添加中间件,打印所有接收的请求头,确认Authorization头是否被传递:

// 放在UseAuthentication之前
app.Use(async (context, next) =>
{
    foreach (var header in context.Request.Headers)
    {
        Console.WriteLine($"{header.Key}: {header.Value}");
    }
    await next();
});

如果确认头丢失,可在AppHost项目中为API服务添加强制传递请求头的中间件:

var api = builder.AddProject<Projects.YourApi>("yourapi")
    .WithHttpEndpoint(port: 5085)
    .WithMiddleware(async (context, next) =>
    {
        foreach (var header in context.Request.Headers)
        {
            context.Request.Headers.TryAdd(header.Key, header.Value);
        }
        await next();
    });

5. 检查跨域配置(若存在)

如果Swagger与API存在跨域场景,确保CORS配置允许Authorization头传递:

builder.Services.AddCors(options =>
{
    options.AddPolicy("AllowAll", policy =>
    {
        policy.AllowAnyOrigin()
              .AllowAnyMethod()
              .AllowAnyHeader()
              .WithExposedHeaders("Authorization");
    });
});

app.UseCors("AllowAll");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 19:50:07