首页 > 解决方案 > swashbuckle 5.3.1 swagger ui 不发送授权标头

问题描述

我将一个项目从 dotnet core 2.1 迁移到 3.1。除了使用 swagger ui 时未发送授权标头外,一切看起来都不错。我发现了几个试图解决这个问题的 SO,这就是它的结果。

标题

在此处输入图像描述

启动.cs

   services.AddAuthentication(options =>
   {
      options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
      options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
       options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddJwtBearer(options =>
    {
      options.RequireHttpsMetadata = (Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Development") ? false : true;
      options.ClaimsIssuer = jwtAppSettingOptions[nameof(JwtIssuerOptions.Issuer)];
            options.TokenValidationParameters = tokenValidationParameters;
    });


  services.AddSwaggerGen(c =>
  {
   ...
   c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
   {
      Name = "Authorization",
      Type = SecuritySchemeType.ApiKey,
      Scheme = "Bearer",
      BearerFormat = "JWT",
      In = ParameterLocation.Header,
      Description = "JWT Authorization header using the Bearer scheme."
   });
   c.AddSecurityRequirement(new OpenApiSecurityRequirement
     {
       {
         new OpenApiSecurityScheme
         {
           Reference = new OpenApiReference
           {
               Type = ReferenceType.SecurityScheme,
               Id = "Bearer"
           }
         },
         new string[] {}
    }
  });
  c.EnableAnnotations();
  //
  c.OperationFilter<HeaderParametersFilter>();
  ...
  }

在以前版本的 Swashbuckle 中,这是使用IOperationFilter实现处理的,我将其保留在原位,以便可以在 ui 中输入令牌。最有希望的 SO 答案是Migrating to Swashbuckle.AspNetCore version 5,其中找到了解决方案,但相同的配置对我不起作用。

HeaderParametersFilter : IOperationFilter

  ...
   if (isAuthorized && !allowAnonymous) {
            AddHeader(operation, "Authorization", "access token", "string", true, "Bearer {access token}");        
    }
   ...
    private static void AddHeader(OpenApiOperation operation, string name, string description, string type, bool isRequired, string defaultValue)
    {
        operation.Parameters.Add(new OpenApiParameter
        {
            Name = name,
            In = ParameterLocation.Header,
            Description = description,
            Required = isRequired,
            Schema = new OpenApiSchema
            {
                Type = type,
                Default = new OpenApiString(defaultValue)
            }
        });
    }

标签: .net-corejwtswagger-ui.net-core-3.1

解决方案


推荐阅读