Otentikasi dan Swagger JWT dengan .Net core 3.0

10

Saya mengembangkan beberapa Web Api dengan .Net core 3.0 dan ingin mengintegrasikannya dengan SwashBuckle.Swagger. Ini berfungsi dengan baik, tetapi ketika saya menambahkan otentikasi JWT, itu tidak berfungsi seperti yang saya harapkan. Untuk melakukan itu, saya menambahkan kode di bawah ini:

  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
            });

        });

Setelah menambahkan AddSecurityDefinitionfungsi, saya dapat melihat tombol Otorisasi dan ketika saya mengkliknya, saya melihat formulir di bawah ini: masukkan deskripsi gambar di sini

Kemudian saya mengetik Bearer WhatEverApiKeyIsfgdgdgdg845734987fgdhgiher635kjh, Setelah melakukan itu saya berharap melihat authorization: Bearer WhatEverApiKeyIsfgdgdgdg845734987fgdhgiher635kjhdi header permintaan, ketika saya mengirim permintaan ke Web Api dari Swagger. Tetapi otorisasi tidak ditambahkan ke header permintaan. Saya menggunakan SwashBuckle.Swagger (5.0.0-rc3). Harap dicatat ada banyak sampel yang berfungsi dengan baik pada .net core 2.0, tetapi fungsi swashbuckle swagger telah berubah pada versi terbaru sehingga saya tidak dapat menggunakan sampel itu.

Mehrdad Babaki
sumber
Pada tautan yang Anda sebutkan tidak ada jawaban. Net core 3.0 juga sedikit berbeda.
Mehrdad Babaki
Jawabannya adalah menambahkan .AddSecurityRequirement(secara global) atau .Security(pada tingkat operasi) - sebagaimana dijelaskan dalam jawaban untuk pertanyaan terkait. AddSecurityDefinitionsendiri tidak cukup.
Helen
Saya menambahkan tetapi tidak ada yang berubah. Saya pikir itu sebabnya itu tidak dipilih sebagai jawaban.
Mehrdad Babaki
Saya menjawab ini baru-baru ini pada pertanyaan lain lihat di sini: stackoverflow.com/a/57872872/3952573
Pavlos

Jawaban:

33

Setelah beberapa penelitian, saya akhirnya menemukan jawabannya di sini

Sebelum melihat halaman ini, saya tahu bahwa saya harus menggunakan AddSecurityRequirementsetelah AddSecurityDefinitionkarena banyak sampel, tetapi itu adalah masalah bahwa parameter fungsi telah berubah pada .NET Core 3.0.

Omong-omong, jawaban akhirnya adalah sebagai berikut:

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[] { } 
    } 
  });
});
Mehrdad Babaki
sumber
Banyak terima kasih, itu bekerja dengan baik untuk saya
Anas Al-Qudah
2
Ini berhasil .. Kiat: jangan lupa untuk menulis "Pembawa" sebelum token yang sebenarnya. Dan itu agak menjengkelkan bahwa kesombongan selalu mengatakan resmi, tidak peduli apa yang Anda tulis di Textbox ... Terima kasih!
CodeHacker
Ini bekerja pada net core 3 dan sombong
ericpap
Siapa pun yang Menyelamatkan Kehidupan, Menyelamatkan Dunia. Anda menyelamatkan hidup saya ;-) thx
Vahid Farahmandian
6

Jika Anda menggunakan Swagger 3.0 maka ia memiliki dukungan bawaan untuk otentikasi JWT.

Anda perlu menggunakan ParameterLocation.Header, SecuritySchemeType.Http, bearer, dan JWT di OpenApiSecurityScheme seperti yang ditunjukkan di bawah ini.

Setelah ini, Anda tidak perlu menentukan token dalam format Bearer {token} . Hanya tentukan token dan skema keamanan akan secara otomatis menerapkannya di header.

// 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);

masukkan deskripsi gambar di sini

ameya
sumber
Terima kasih! Setelah banyak posting yang tidak berhasil untuk saya, metode ini berhasil !!
Matt Casto
2

Jika Anda tidak ingin menambahkan token secara manual dan Anda ingin cakupan dipilih bersamaan dengan mengirimkan clientId ke server identitas Anda dapat menambahkan sesuatu seperti ini.

Saya telah menggunakan aliran implisit, tetapi Anda dapat mengonfigurasi aliran apa pun menggunakan mekanisme berikut:

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                    
});

Outputnya akan seperti ini:

masukkan deskripsi gambar di sini

Prabhanjan Kumar Mahapatra
sumber
1

Berikut solusi yang diperbarui untuk Swashbuckle.AspNetCore 5.3.2, terintegrasi dengan IdentityServer4, dengan API yang diamankan menggunakan token Bearer.

Dalam ConfigureServices()metode:

        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>() }
            });
        });

Dalam Configure()metode:

        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,

    };
}
Paul Taylor
sumber
Ini adalah penyelamat. Ini juga berfungsi untuk aliran implisit di mana saya mengubah Kata Sandi menjadi Tersirat dalam pengaturan Arus. Terima kasih banyak!
Larsbj
0

Jika ada yang menggunakan NSwag dan telah mendarat di sini setelah mencari solusinya, inilah tautan dari dokumentasi resmi.

NSwag Mengaktifkan otentikasi JWT

PS: Saya tahu pertanyaan aslinya adalah untuk SwashBuckle, tetapi Google menunjukkan tautan ini terlebih dahulu ketika mencari NSwag juga.

Prateek Kumar Dalbehera
sumber