.Net core 3.0 ile JWT Kimlik Doğrulaması ve Swagger


10

Net Core 3.0 ile bazı Web Api geliştiriyorum ve SwashBuckle.Swagger ile entegre etmek istiyorum. İyi çalışıyor, ancak JWT kimlik doğrulaması eklediğimde, beklediğim gibi çalışmıyor. Bunu yapmak için aşağıdaki kodu ekledim:

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

        });

AddSecurityDefinitionİşlev ekledikten sonra Yetkilendir düğmesini görebilirim ve tıkladığımda aşağıdaki formu görüyorum: resim açıklamasını buraya girin

Sonra yazıyorum Bearer WhatEverApiKeyIsfgdgdgdg845734987fgdhgiher635kjh, Bunu yaptıktan sonra authorization: Bearer WhatEverApiKeyIsfgdgdgdg845734987fgdhgiher635kjhSwagger'den Web Api'ye bir istek gönderdiğimde, isteğin başlığında görmeyi bekliyorum . Ancak istek üstbilgisine yetkilendirme eklenmez. SwashBuckle.Swagger (5.0.0-rc3) kullanıyorum. Lütfen .net core 2.0 üzerinde iyi çalışan birçok örnek olduğunu unutmayın, ancak Swashbuckle swagger işlevleri en son sürümde değişti, bu yüzden bu örnekleri kullanamıyorum.



Bahsettiğiniz linkte cevap yok. Ayrıca .net core 3.0 biraz farklıdır.
Mehrdad Babaki

Cevap, bağlantılı sorunun yanıtlarında açıklandığı gibi .AddSecurityRequirement(küresel olarak) veya .Security(çalışma seviyesinde) eklemektir . AddSecurityDefinitiontek başına yeterli değildir.
Helen

Ekledim ama hiçbir şey değişmedi. Bu yüzden cevap olarak seçilmediğini düşünüyorum.
Mehrdad Babaki

Geçenlerde başka bir soruya bu konuda cevap verdim: stackoverflow.com/a/57872872/3952573
Pavlos

Yanıtlar:


33

Biraz araştırmadan sonra, sonunda cevabını buldu burada

Bu sayfayı görmeden önce, ben kullanması gerektiğini biliyordu AddSecurityRequirementsonra AddSecurityDefinitionçünkü birçok numunelerin, ancak işlev parametreleri .NET Çekirdek 3.0 üzerinde değiştiğini bir sorun oldu.

Bu arada, son cevap aşağıdaki gibidir:

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[] { } 
    } 
  });
});

Çok teşekkürler, benim için iyi çalışıyor
Anas Al-Qudah

2
Bu işe yaradı .. İpucu: gerçek jetondan önce "Taşıyıcı" yazmayı unutmayın. Ve Metin Kutusuna ne yazıyor olursanız olun, havalı her zaman yetkili diyor biraz sinir bozucu ... Teşekkürler!
CodeHacker

Bu net core 3 ve swagger üzerinde çalışır
ericpap

Kim bir hayat kurtarırsa dünyayı kurtarır. Hayatımı kurtardın ;-) thx
Vahid Farahmandian

6

Swagger 3.0 kullanıyorsanız, JWT kimlik doğrulaması için yerleşik desteğe sahiptir.

OpenApiSecurityScheme içinde aşağıda gösterildiği gibi ParameterLocation.Header, SecuritySchemeType.Http, bearer ve JWT kullanmanız gerekir.

Bundan sonra, belirteci Bearer {token} biçiminde belirtmeniz gerekmez . Yalnızca belirteci belirttiğinizde güvenlik düzeni otomatik olarak üstbilgiye uygulanır.

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

resim açıklamasını buraya girin


Teşekkür ederim! Benim için işe yaramadı birçok yazı sonra, bu yöntem işe yaradı!
Matt Casto

2

Manuel olarak bir simge eklemek istemiyorsanız ve kimlik sunucusuna bir clientId iletmeyle birlikte kapsamların seçilebilir olmasını istiyorsanız, bunun gibi bir şey ekleyebilirsiniz.

Örtük akışı kullandım, ancak aşağıdaki mekanizmayı kullanarak herhangi bir akışı yapılandırabilirsiniz:

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

Çıktı şu şekilde olacaktır:

resim açıklamasını buraya girin


1

Aşağıda, IdentityServer4 ile entegre edilmiş ve bir Taşıyıcı belirteci kullanılarak korunan bir API ile Swashbuckle.AspNetCore 5.3.2 için güncellenmiş bir çözüm bulunmaktadır.

İn ConfigureServices()yöntemi:

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

İn Configure()yöntemi:

        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,

    };
}

Bu bir hayat kurtarıcı. Ayrıca, Akışlar kurulumunda Parolayı Örtük olarak değiştirdiğim örtük akış için de çalışır. Çok teşekkür ederim!
Larsbj

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.