簡體   English   中英

如何在 .Net Core 中的 Swashbuckle 上實現 JWT 令牌身份驗證?

[英]How to implement a JWT Token Authentication on Swashbuckle in .Net Core?

我在 Swagger UI/Swashbuckle 中實現 JWT 令牌身份驗證時遇到問題。

我在Startup.cs實現了此代碼作為文檔中的示例。

在方法ConfigureServices 中

        _ = services.AddSwaggerGen(c =>
          {
              c.SwaggerDoc("v1", new OpenApiInfo
              {
                  Title = "Proyekto4Juan API",
                  Version = "v1"
              });

              c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
              {
                  In = ParameterLocation.Header,
                  Description = "Please insert token",
                  Name = "Authorization",
                  Type = SecuritySchemeType.Http,
                  BearerFormat = "JWT",
                  Scheme = "bearer"
              });

              c.AddSecurityRequirement(new OpenApiSecurityRequirement {
                  {
                      new OpenApiSecurityScheme
                      {
                          Reference = new OpenApiReference
                          {
                              Type = ReferenceType.SecurityScheme,
                              Id = "Bearer"
                          }
                      },
                      new string[]{}
                  }
              });
          });

        services.AddAuthorization(auth =>
        {
            auth.AddPolicy("Bearer", new AuthorizationPolicyBuilder()
                .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme‌​)
                .RequireAuthenticatedUser().Build());
        });

        services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options => Configuration.Bind("JwtSettings", options))
                .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options => Configuration.Bind("CookieSettings", options));

並在Configure方法上

 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseHttpsRedirection();

            app.UseRouting();

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

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

            app.UseStatusCodePages();

            app.UseCors(x => x
                .AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader());


            app.UseSwagger();

            app.UseSwaggerUI(c => {
                c.DefaultModelExpandDepth(0);
                c.DefaultModelsExpandDepth(-1);
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "V1 API test");
                c.RoutePrefix = string.Empty;
            });
        }

但是當我使用 Swagger UI 在控制器上測試我的操作時。

錯誤響應 401

在端點上,我像這樣裝飾了我的動作。

    [HttpPost]
    [Route("DestroyUserSession")]
    [Authorize]
    public async Task<ResultModel> DestroyUserSession([FromBody] string userID)
    {
      //..... Do Something
    }

您似乎缺少一些屬性設置:- 即AddSecurityRequirement部分的Scheme, Name, In AddSecurityRequirement

例子:

options.AddSecurityRequirement(new OpenApiSecurityRequirement
{
    {
        new OpenApiSecurityScheme
        {
            Reference = new OpenApiReference
            {
                Type = ReferenceType.SecurityScheme,
                Id = "Bearer",
            },
            Scheme = "Bearer",
            Name = "Bearer",
            In = ParameterLocation.Header,
        }, new List<string>()

    ....</snipped>

添加授權失敗? 像這樣:

 public void ConfigureServices(IServiceCollection services)
        {

            services.AddControllers(options =>
            {
                options.Conventions.Add(new GroupingByNamespaceConvention());
            });

            services.AddSwaggerGen(config =>
            {
                config.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
                {
                    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\"",
                    Name = "Authorization",
                    In = ParameterLocation.Header,
                    Type = SecuritySchemeType.ApiKey,
                    Scheme = "Bearer"
                });

                config.AddSecurityRequirement(new OpenApiSecurityRequirement()
{
    {
        new OpenApiSecurityScheme
        {
            Reference = new OpenApiReference
            {
                Type = ReferenceType.SecurityScheme,
                Id = "Bearer"
            },
            Scheme = "oauth2",
            Name = "Bearer",
            In = ParameterLocation.Header,

        },
        new List<string>()
    }
});
}

結果:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM