.Netコア3.0でのJWT認証とSwagger


10

.Net core 3.0でWeb APIをいくつか開発していて、それを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、SwaggerからWeb APIにリクエストを送信すると、リクエストのヘッダーに表示されるはずです。ただし、承認はリクエストヘッダーに追加されません。私はSwashBuckle.Swagger(5.0.0-rc3)を使用しています。.netコア2.0で正常に動作するサンプルは多数ありますが、最新バージョンではSwashbuckleのSwagger関数が変更されているため、そのサンプルを使用できません。



あなたが言及したリンクには答えはありません。また、.net core 3.0は少し異なります。
Mehrdad Babaki、

答えは、リンクされた質問への回答で説明されているように、.AddSecurityRequirement(グローバルに)または.Security(操作レベルで)追加することです。AddSecurityDefinition一人では十分ではありません。
Helen

追加したが何も変わっていない。それが答えとして選ばれていない理由だと思います。
Mehrdad Babaki、

私は最近、別の質問でこれに答えました:こちらをご覧ください:stackoverflow.com/a/57872872/3952573
Pavlos

回答:


33

いくつかの調査の後、私は最終的にここで答えを見つけました

このページを見る前に、サンプルが多いのでAddSecurityRequirement後で使うべきだと思いましAddSecurityDefinitionたが、.NET Core 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[] { } 
    } 
  });
});

多くのおかげで、それは私と一緒に仕事の罰金です
アナスアルQudah

2
これはうまくいきました。.ヒント:実際のトークンの前に "Bearer"を書くことを忘れないでください。そして、テキストボックスに何を書いても、swaggerが常に承認済みと言うのは少し面倒です...ありがとう!
CodeHacker

これはネットコア3と
swaggerで動作します

命を救う者は世界を救う。あなたは私の命を救った;-) thx
Vahid Farahmandian

6

Swagger 3.0を使用している場合は、JWT認証のサポートが組み込まれています。

以下に示すように、OpenApiSecuritySchemeでParameterLocation.Header、SecuritySchemeType.Http、bearer、およびJWTを使用する必要があります。

この後は、トークンをBearer {token}形式で指定する必要はありません。トークンを指定するだけで、セキュリティスキームはそれを自動的にヘッダーに適用します。

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

ここに画像の説明を入力してください


ありがとうございました!私にとってうまくいかなかった多くの投稿の後、この方法はうまくいきました!
Matt Casto

2

トークンを手動で追加したくなく、スコープを選択可能にするとともに、clientIdをIDサーバーに渡す場合は、次のように追加できます。

私は暗黙のフローを使用しましたが、次のメカニズムを使用して任意のフローを構成できます。

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

これは、IdentityServer4と統合されたSwashbuckle.AspNetCore 5.3.2用に更新されたソリューションで、APIはベアラートークンを使用して保護されています。

では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,

    };
}

これは命の恩人です。また、フロー設定でパスワードを暗黙に変更した暗黙フローにも機能します。どうもありがとうございました!
Larsbj

0

誰かがNSwagを使用していて、解決策を検索した後にここに到達した場合、公式ドキュメントからのリンクは次のとおりです。

NSwag JWT認証を有効にする

PS:元の質問はSwashBuckleに関するものでしたが、GoogleはNSwagを検索するときに最初にこのリンクを表示します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.