Xác thực và vênh vang JWT với .Net core 3.0


10

Tôi đang phát triển một số Api Web với .Net core 3.0 và muốn tích hợp nó với SwashBuckle.Swagger. Nó hoạt động tốt, nhưng khi tôi thêm xác thực JWT, nó không hoạt động như tôi mong đợi. Để làm điều đó, tôi đã thêm mã dưới đây:

  services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo { Title = "My Web API", Version = "v1" });
            c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
            {
                Description = "JWT Authorization header using the Bearer scheme. Example: \"Authorization: Bearer {token}\"",
                Name = "Authorization",
                In = ParameterLocation.Header,
                Type = SecuritySchemeType.ApiKey
            });

        });

Sau khi thêm AddSecurityDefinitionchức năng, tôi có thể thấy nút Ủy quyền và khi tôi nhấp vào nó, tôi thấy biểu mẫu bên dưới: nhập mô tả hình ảnh ở đây

Sau đó, tôi gõ Bearer WhatEverApiKeyIsfgdgdgdg845734987fgdhgiher635kjh, Sau khi thực hiện, tôi hy vọng sẽ thấy authorization: Bearer WhatEverApiKeyIsfgdgdgdg845734987fgdhgiher635kjhtrong tiêu đề của yêu cầu, khi tôi gửi yêu cầu tới Api Web từ Swagger. Nhưng ủy quyền không được thêm vào tiêu đề yêu cầu. Tôi đang sử dụng SwashBuckle.Swagger (5.0.0-rc3). Xin lưu ý rằng có nhiều mẫu hoạt động tốt trên .net core 2.0, nhưng các chức năng vênh của Swashbuckle đã thay đổi trên phiên bản mới nhất để tôi không thể sử dụng các mẫu đó.



Trên đường dẫn bạn đề cập không có câu trả lời. Ngoài ra .net core 3.0 có chút khác biệt.
Mehrdad Babaki

Câu trả lời là thêm .AddSecurityRequirement(toàn cầu) hoặc .Security(ở cấp độ hoạt động) - như được giải thích trong các câu trả lời cho câu hỏi được liên kết. AddSecurityDefinitionMột mình là không đủ.
Helen

Tôi đã thêm nhưng không có gì thay đổi. Tôi nghĩ đó là lý do tại sao nó không được chọn làm câu trả lời.
Mehrdad Babaki

Tôi đã trả lời điều này gần đây về một câu hỏi khác có một cái nhìn ở đây: stackoverflow.com/a/57872872/3952573
Pavlos

Câu trả lời:


33

Sau một số nghiên cứu, cuối cùng tôi đã tìm thấy câu trả lời ở đây

Trước khi xem trang này, tôi biết rằng tôi nên sử dụng AddSecurityRequirementsau AddSecurityDefinitionvì nhiều mẫu, nhưng vấn đề là các tham số chức năng đã thay đổi trên .NET Core 3.0.

Nhân tiện, câu trả lời cuối cùng là như sau:

services.AddSwaggerGen(c =>
{
  c.SwaggerDoc("v1", new OpenApiInfo { 
    Title = "My API", 
    Version = "v1" 
  });
  c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme {
    In = ParameterLocation.Header, 
    Description = "Please insert JWT with Bearer into field",
    Name = "Authorization",
    Type = SecuritySchemeType.ApiKey 
  });
  c.AddSecurityRequirement(new OpenApiSecurityRequirement {
   { 
     new OpenApiSecurityScheme 
     { 
       Reference = new OpenApiReference 
       { 
         Type = ReferenceType.SecurityScheme,
         Id = "Bearer" 
       } 
      },
      new string[] { } 
    } 
  });
});

Rất cám ơn, nó hoạt động tốt với tôi
Anas Al-Qudah

2
Điều này đã làm việc .. Mẹo: đừng quên viết "Bearer" trước mã thông báo thực tế. Và có một chút khó chịu khi vênh vang luôn nói có thẩm quyền, bất kể bạn viết gì trong Hộp văn bản ... Cảm ơn!
CodeHacker

Điều này hoạt động trên lõi mạng 3 và vênh vang
ericpap

Bất cứ ai cứu một cuộc sống cứu thế giới. Bạn đã cứu mạng tôi ;-) thx
Vahid Farahmandian

6

Nếu bạn đang sử dụng Swagger 3.0 thì nó có hỗ trợ tích hợp để xác thực JWT.

Bạn cần sử dụng ParameterLocation.Header, SecuritySchemeType.Http, mang và JWT trong OpenApiSecurityScheme như hiển thị bên dưới.

Sau này, bạn sẽ không cần chỉ định mã thông báo ở định dạng Bearer {token} . Chỉ chỉ định mã thông báo và sơ đồ bảo mật sẽ tự động áp dụng nó trong tiêu đề.

// Bearer token authentication
OpenApiSecurityScheme securityDefinition = new OpenApiSecurityScheme()
{
    Name = "Bearer",
    BearerFormat = "JWT",
    Scheme = "bearer",
    Description = "Specify the authorization token.",
    In = ParameterLocation.Header,
    Type = SecuritySchemeType.Http,
};
c.AddSecurityDefinition("jwt_auth", securityDefinition);

// Make sure swagger UI requires a Bearer token specified
OpenApiSecurityScheme securityScheme = new OpenApiSecurityScheme()
{
    Reference = new OpenApiReference()
    {
        Id = "jwt_auth",
        Type = ReferenceType.SecurityScheme
    }
};
OpenApiSecurityRequirement securityRequirements = new OpenApiSecurityRequirement()
{
    {securityScheme, new string[] { }},
};
c.AddSecurityRequirement(securityRequirements);

nhập mô tả hình ảnh ở đây


Cảm ơn bạn! Sau nhiều bài viết không hiệu quả với tôi, phương pháp này đã làm !!
Matt Casto

2

Nếu bạn không muốn thêm mã thông báo theo cách thủ công và bạn muốn phạm vi có thể được chọn cùng với việc chuyển clientId đến máy chủ nhận dạng, bạn có thể thêm một cái gì đó như thế này.

Tôi đã sử dụng luồng ngầm, nhưng bạn có thể định cấu hình bất kỳ luồng nào bằng cơ chế sau:

options.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme()
{
  Flows = new OpenApiOAuthFlows
  {
    Implicit = new OpenApiOAuthFlow
    {                            
      AuthorizationUrl = new Uri("http://localhost"),
      TokenUrl = new Uri("http://localhost"),
      Scopes = new Dictionary<string, string>
      {
        { "Foundation API", "FoundationApi" }
      }
    }
  },
  In = ParameterLocation.Header,                    
  Name = "Authorization",
  Type = SecuritySchemeType.OAuth2                    
});

Đầu ra sẽ như thế này:

nhập mô tả hình ảnh ở đây


1

Đây là một giải pháp được cập nhật cho Swashbuckle.AspNetCore 5.3.2, được tích hợp với IdentityServer4, với API được bảo mật bằng mã thông báo Bearer.

Trong ConfigureServices()phương pháp:

        services.AddSwaggerGen(options =>
        {
            options.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
            options.AddSecurityDefinition("Bearer", SecuritySchemes.BearerScheme(Configuration));
            options.AddSecurityRequirement(new OpenApiSecurityRequirement()
            {
                { SecuritySchemes.OAuthScheme, new List<string>() }
            });
        });

Trong Configure()phương pháp:

        app.UseSwaggerUI(options =>
        {
            options.SwaggerEndpoint("/My.Api/swagger/v1/swagger.json", "My API V1");
            options.OAuthClientId(Clients.TestClient);
            options.OAuthAppName("My Api - Swagger");
            options.OAuthClientSecret(Configuration["TestClientSecret"]);
        });

internal static class SecuritySchemes
{
    public static OpenApiSecurityScheme BearerScheme(IConfiguration config) => new OpenApiSecurityScheme
    {
        Type = SecuritySchemeType.OAuth2,
        Description = "Standard authorisation using the Bearer scheme. Example: \"bearer {token}\"",
        In = ParameterLocation.Header,
        Name = "Authorization",
        Scheme = "Bearer",
        OpenIdConnectUrl = new System.Uri($"{config["TokenServerUrl"]}.well-known/openid-configuration"),
        BearerFormat = "JWT",
        Flows = new OpenApiOAuthFlows
        {
            Password = new OpenApiOAuthFlow
            {
                AuthorizationUrl = new System.Uri($"{config["TokenServerUrl"]}connect/authorize"),
                Scopes = new Dictionary<string, string>
                    {
                        { Scopes.Api, "My Api" }
                    },
                TokenUrl = new System.Uri($"{config["TokenServerUrl"]}connect/token")
            }
        }
    };

    public static OpenApiSecurityScheme OAuthScheme => new OpenApiSecurityScheme
    {
        Reference = new OpenApiReference
        {
            Type = ReferenceType.SecurityScheme,
            Id = "Bearer"
        },
        Scheme = "oauth2",
        Name = "Bearer",
        In = ParameterLocation.Header,

    };
}

Đây là một cứu tinh. Nó cũng hoạt động cho luồng ngầm nơi tôi đã thay đổi Mật khẩu thành Ngầm trong thiết lập Flows. Cảm ơn bạn rất nhiều!
Larsbj

0

Nếu bất cứ ai đang sử dụng NSwag và đã hạ cánh ở đây sau khi tìm kiếm giải pháp, đây là liên kết từ tài liệu chính thức.

NSwag Kích hoạt xác thực JWT

PS: Tôi biết câu hỏi ban đầu là dành cho SwashBuckle, nhưng Google cũng hiển thị liên kết này đầu tiên khi tìm kiếm NSwag.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.