web-dev-qa-db-fra.com

Authentification JWT et Swagger avec .Net core 3.0

Je développe une API Web avec .Net core 3.0 et je souhaite l'intégrer à SwashBuckle.Swagger. Cela fonctionne bien, mais lorsque j'ajoute l'authentification JWT, cela ne fonctionne pas comme prévu. Pour ce faire, j'ai ajouté le code ci-dessous:

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

        });

Après avoir ajouté la fonction AddSecurityDefinition, je peux voir le bouton Autoriser et quand je clique dessus, je vois le formulaire ci-dessous: enter image description here

Ensuite, je tape Bearer WhatEverApiKeyIsfgdgdgdg845734987fgdhgiher635kjh, Après l'avoir fait, je m'attends à voir authorization: Bearer WhatEverApiKeyIsfgdgdgdg845734987fgdhgiher635kjh dans l'en-tête de la demande, lorsque j'envoie une demande à Web Api depuis Swagger. Mais l'autorisation n'est pas ajoutée à l'en-tête de la demande. J'utilise SwashBuckle.Swagger (5.0.0-rc3). Veuillez noter qu'il existe de nombreux exemples qui fonctionnent correctement sur .net core 2.0, mais les fonctions de swagger Swashbuckle ont changé sur la dernière version, donc je ne peux pas utiliser ces exemples.

9
Mehrdad Babaki

Si vous ne souhaitez pas ajouter un jeton manuellement et que vous souhaitez que les étendues soient sélectionnables et que vous passiez un clientId au serveur d'identité, vous pouvez ajouter quelque chose comme ceci.

J'ai utilisé un flux implicite, mais vous pouvez configurer n'importe quel flux à l'aide du mécanisme suivant:

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

La sortie sera comme ceci:

enter image description here

Voici une solution mise à jour pour Swashbuckle.AspNetCore 5.3.2, intégrée à IdentityServer4, avec une API sécurisée à l'aide d'un jeton Bearer.

Dans la méthode 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>() }
            });
        });

Dans la méthode 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,

    };
}
1
Paul Taylor

Si quelqu'un utilise NSwag et a atterri ici après avoir recherché la solution, voici le lien de la documentation officielle.

NSwag Activer l'authentification JWT

PS: Je sais que la question d'origine était pour SwashBuckle, mais Google affiche également ce lien lors de la recherche de NSwag.