.WW कोर 3.0 के साथ JWT ऑथेंटिकेशन एंड स्वैगर


10

मैं .net Core 3.0 के साथ कुछ वेब एपी विकसित कर रहा हूं और इसे SwashBuckle.Swagger के साथ एकीकृत करना चाहता हूं। यह ठीक काम कर रहा है, लेकिन जब मैं JWT प्रमाणीकरण जोड़ता हूं, तो यह काम नहीं करता है जैसा कि मैं उम्मीद करता हूं। ऐसा करने के लिए, मैंने नीचे दिया गया कोड जोड़ा:

  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फ़ंक्शन जोड़ने के बाद , मैं अधिकृत बटन देख सकता हूं और जब मैं इसे क्लिक करता हूं, तो मुझे नीचे दिया गया फ़ॉर्म दिखाई देता है: यहां छवि विवरण दर्ज करें

फिर मैं टाइप करता हूं Bearer WhatEverApiKeyIsfgdgdgdg845734987fgdhgiher635kjh, इसे करने के बाद मैं authorization: Bearer WhatEverApiKeyIsfgdgdgdg845734987fgdhgiher635kjhअनुरोध के हेडर में देखने की उम्मीद करता हूं , जब मैं स्वैगर से वेब एप को एक अनुरोध भेजता हूं। लेकिन प्राधिकरण अनुरोध शीर्षलेख में नहीं जोड़ा गया है। मैं SwashBuckle.Swagger (5.0.0-rc3) का उपयोग कर रहा हूं। कृपया ध्यान दें कि कई नमूने हैं जो .net core 2.0 पर ठीक काम करते हैं, लेकिन Swashbuckle swagger फ़ंक्शन नवीनतम संस्करण में बदल गए हैं, इसलिए मैं उस नमूनों का उपयोग नहीं कर सकता।



आपके द्वारा बताए गए लिंक पर कोई जवाब नहीं है। इसके अलावा .net कोर 3.0 थोड़ा अलग है।
मेहरदाद बाबकी

उत्तर जोड़ने के लिए .AddSecurityRequirement(विश्व स्तर पर) या .Security(ऑपरेशन के स्तर पर) - जैसा कि जुड़े हुए प्रश्न के उत्तर में बताया गया है। AddSecurityDefinitionअकेला पर्याप्त नहीं है।
हेलेन

मैंने जोड़ा लेकिन कुछ नहीं बदला। मुझे लगता है कि इसीलिए इसे उत्तर के रूप में नहीं चुना गया है।
मेहरदाद बाबकी

मैंने इसका उत्तर हाल ही में एक और प्रश्न पर दिया है, यहाँ देखें: stackoverflow.com/a/57872872/3952573
Pavlos

जवाबों:


33

कुछ शोध के बाद, मैं अंत में इस सवाल का जवाब मिल गया यहाँ

इस पृष्ठ को देख से पहले, मैं जानता था कि मैं का उपयोग करना चाहिए AddSecurityRequirementके बाद AddSecurityDefinition, क्योंकि कई नमूनों की, लेकिन यह एक समस्या यह है कि समारोह मापदंडों नेट कोर 3.0 पर बदल गया है था।

वैसे, अंतिम उत्तर नीचे दिया गया है:

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

बहुत धन्यवाद, यह मेरे साथ ठीक है
अनस अल-कुद्दाह

2
यह काम किया .. टिप: वास्तविक टोकन से पहले "बीयरर" लिखना न भूलें। और यह थोड़ा कष्टप्रद है कि स्वैगर हमेशा अधिकृत कहता है, चाहे आप टेक्स्टबॉक्स में कुछ भी लिखें ... धन्यवाद!
कोडहैकर

यह शुद्ध कोर 3 और स्वैगर पर काम करता है
ericpap

जो कोई जीवन बचाता है वह दुनिया को बचाता है। आपने मेरी जान बचाई ;-) thx
वाहिद फरहमंदियन

6

यदि आप Swagger 3.0 का उपयोग कर रहे हैं तो इसमें JWT प्रमाणीकरण के लिए बिल्ड-इन सपोर्ट है।

आपको नीचे दिखाए अनुसार ParameterLocation.Header, SecuritySchemeType.Http, वाहक, और OpenApiSecurityScheme में JWT का उपयोग करने की आवश्यकता है।

इसके बाद, आपको बियरर {टोकन} प्रारूप में टोकन निर्दिष्ट करने की आवश्यकता नहीं होगी । केवल टोकन निर्दिष्ट करें और सुरक्षा योजना इसे हेडर में स्वचालित रूप से लागू करेगी।

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

यहां छवि विवरण दर्ज करें


धन्यवाद! कई पोस्ट के बाद जो मेरे काम नहीं आया, यह तरीका किया !!
मैट कास्टो

2

यदि आप मैन्युअल रूप से एक टोकन नहीं जोड़ना चाहते हैं और आप चाहते हैं कि स्कोप्स एक क्लाइंटआईड के साथ चयन करने योग्य हो तो पहचान सर्वर में आप कुछ इस तरह जोड़ सकते हैं।

मैंने अंतर्निहित प्रवाह का उपयोग किया है, लेकिन आप निम्न तंत्र का उपयोग करके किसी भी प्रवाह को कॉन्फ़िगर कर सकते हैं:

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

आउटपुट इस प्रकार होगा:

यहां छवि विवरण दर्ज करें


1

यहाँ Swashbuckle.AspNetCore 5.3.2 के लिए एक समाधान अपडेट किया गया है, IdentityServer4 के साथ एकीकृत, एक एपीआई एक बियर टोकन का उपयोग करके सुरक्षित है।

में ConfigureServices()विधि:

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

में Configure()विधि:

        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,

    };
}

यह एक जीवन रक्षक है। यह निहित प्रवाह के लिए भी काम करता है जहां मैंने फ़्लोज़ सेटअप में पासवर्ड को इंप्लांट में बदल दिया है। आपका बहुत धन्यवाद!
लार्सबज

0

यदि कोई NSwag का उपयोग कर रहा है और समाधान खोजने के बाद यहां उतरा है, तो यहां आधिकारिक दस्तावेज से लिंक है।

NSWag JWT प्रमाणीकरण सक्षम करें

PS: मुझे पता है कि मूल प्रश्न SwashBuckle के लिए था, लेकिन Google इस लिंक को सबसे पहले NSWag की खोज करते समय दिखाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.