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

.NET 7 Minimal API:Swagger认证失败但Postman可正常访问

.NET 7 Web API Swagger调用返回401但Postman正常问题排查

问题描述

我有一个.NET 7版本的极简Web API,使用Swagger测试接口时会返回401未授权错误,但通过Postman调用相同接口却可以正常工作。

使用的NuGet包版本:

  • Microsoft.AspNetCore.Authentication.JwtBearer -> 7.0.5
  • Swashbuckle.AspNetCore -> 6.5.0

接口通过MapGet()方法末尾添加.RequireAuthorization(IdentityData.PermissionPolicyName)配置了授权策略,在Swagger中点击Authorize按钮输入"Bearer myToken"后调用Get接口返回401,但Postman执行相同请求正常。

相关配置代码

Swagger配置

var securityScheme = new OpenApiSecurityScheme
{
    Name = "Authorization",
    Type = SecuritySchemeType.ApiKey,
    Scheme = "Bearer",
    BearerFormat = "JWT",
    In = ParameterLocation.Header,
    Description = "JWT Authorization header using the Bearer scheme. \r\n\r\n Enter 'Bearer' [space] and then your token in the text input below.\r\n\r\nExample: \"Bearer 12345abcdef\"",
};
var securityReq = new OpenApiSecurityRequirement
{
    {
        new OpenApiSecurityScheme
        {
            Reference = new OpenApiReference
            {
                Type = ReferenceType.SecurityScheme,
                Id = "bearerAuth"
            },
            Name = "Bearer",
            In = ParameterLocation.Header
        },
        Array.Empty<string>()
    }
};
builder.Services.AddSwaggerGen(options =>
{
    options.SwaggerDoc("v1",
        new OpenApiInfo
        {
            Version = "v1"
        });

    var xmlFilename = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
    options.IncludeXmlComments(Path.Combine(AppContext.BaseDirectory, xmlFilename));

    options.EnableAnnotations();
    options.DocInclusionPredicate((name, api) => true);
    options.AddSecurityDefinition("Bearer", securityScheme);
    options.AddSecurityRequirement(securityReq);
});

认证与授权配置

builder.Services.AddOptions<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme)
    .Configure<IStoreManager>(
        (options, storeManager) => options.TokenValidationParameters =
            new TokenValidationParameters
            {
                IssuerSigningKey = GetKeyFromAmagnoCertificate(storeManager),
                ValidateLifetime = true,
                ValidateIssuerSigningKey = true,
                ValidateIssuer = false,
                ValidateAudience = false
            });
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer();

builder.Services.AddAuthorization(
    options =>
    {
        var requiredClaim = new AuthorizationPolicyBuilder().RequireAuthenticatedUser()
            .RequireClaim(IdentityData.PermissionClaimName, "GroupDocumentRecognitionSettings");

        options.AddPolicy(IdentityData.PermissionPolicyName, requiredClaim.Build());

        options.DefaultPolicy = new AuthorizationPolicyBuilder(JwtBearerDefaults.AuthenticationScheme)
            .RequireAuthenticatedUser()
            .Build();
    });

中间件配置

app.UseAuthentication();
app.UseAuthorization();

疑问

我是否在Swagger配置中遗漏了什么内容?有没有人遇到过类似问题?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 12:55:15