Swagger中的多个JWT

问题描述

我在ASP.NET Core中具有API应用程序,该应用程序具有两个控制器并成功设置了多个承载身份验证和Swagger。身份验证正常工作。我用邮递员检查过。

  • ControllerOne使用authSchemeOne
  • ControllerTwo使用authSchemTwo

我想要实现的是,在Swagger中,我希望同时登录到两个模式,并配置Swagger,以便ControllerOne使用authSchemeOne并相互使用。

现在我必须首先登录。不能同时使用两者(如果我登录到两者,则swagger使用最后一个)。希望我解释得很好。

是否可以在Swagger中进行配置? 身份验证正常工作。

Swagger UI

非常感谢您!

更新Swagger json

一个控制器

/// <summary>
/// FirstController
/// </summary>
[Route("api/[controller]")]
[ApiController]
[Authorize(AuthenticationSchemes = "Bearer")]
public class FirstController : ControllerBase
{
    /// <summary>
    /// Get
    /// </summary>
    /// <returns></returns>
    [HttpGet]
    [ProducesResponseType(StatusCodes.Status200OK)]
    public IActionResult Get()
    {
        return Ok("FirstController");
    }
}

第二个控制器

/// <summary>
/// SecondController
/// </summary>
[Route("api/[controller]")]
[ApiController]
[Authorize(AuthenticationSchemes = "Bearer2")]
public class SecondController : ControllerBase
{
    /// <summary>
    /// Get
    /// </summary>
    /// <returns></returns>
    [HttpGet]
    [ProducesResponseType(StatusCodes.Status200OK)]
    public IActionResult Get()
    {
        return Ok("SecondController");
    }
}

启动

public void ConfigureServices(IServiceCollection services)
    {
        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1",new OpenApiInfo { Title = "Api",Version = "v1" });

            // Set the comments path for the Swagger JSON and UI.
            var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
            var xmlPath = Path.Combine(AppContext.BaseDirectory,xmlFile);
            c.IncludeXmlComments(xmlPath);


            var bearerSecurityScheme = new OpenApiSecurityScheme
            {
                Name = "Authorization",Type = SecuritySchemeType.ApiKey,Scheme = "Bearer",BearerFormat = "JWT",In = ParameterLocation.Header,Reference = new OpenApiReference
                {
                    Type = ReferenceType.SecurityScheme,Id = "Bearer"
                }
            };

            var patientsLikeMeSecurityScheme = new OpenApiSecurityScheme
            {
                Name = "Authorization",Id = "Bearer2"
                }
            };

            c.AddSecurityDeFinition("Bearer",bearerSecurityScheme);
            c.AddSecurityDeFinition("Bearer2",patientsLikeMeSecurityScheme);

            c.AddSecurityRequirement(new OpenApiSecurityRequirement {
                { bearerSecurityScheme,Array.Empty<string>() },{ patientsLikeMeSecurityScheme,Array.Empty<string>() }
            });
        });

        services.AddControllers();

        services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options =>
            {
                options.Audience = "Audience1";
                options.RequireHttpsMetadata = false;

                options.TokenValidationParameters = new TokenValidationParameters()
                {
                    ValidateAudience = true,ValidateIssuer = false,ValidateIssuerSigningKey = false,ValidatetokenReplay = false,ValidateActor = false,ValidateLifetime = false,IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(""))
                };
            })
            .AddJwtBearer("Bearer2",options =>
            {
                options.Audience = "Audience2";
                options.RequireHttpsMetadata = false;

                options.TokenValidationParameters = new TokenValidationParameters()
                {
                    ValidateAudience = true,IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(""))
                };
            });
    }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)