.Net core 3.0을 사용한 JWT 인증 및 스와 거


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기능을 추가 한 후 인증 버튼을 볼 수 있으며 클릭하면 아래 양식이 표시됩니다. 여기에 이미지 설명을 입력하십시오

그런 다음 Swagger에서 Web Api에 요청을 보낼 때 요청 헤더에 표시 될 Bearer WhatEverApiKeyIsfgdgdgdg845734987fgdhgiher635kjh것으로 예상합니다 authorization: Bearer WhatEverApiKeyIsfgdgdgdg845734987fgdhgiher635kjh. 그러나 권한은 요청 헤더에 추가되지 않습니다. SwashBuckle.Swagger (5.0.0-rc3)를 사용하고 있습니다. .net core 2.0에서 잘 작동하는 샘플이 많이 있지만 Swashbuckle swagger 기능이 최신 버전에서 변경되어 해당 샘플을 사용할 수 없습니다.



언급 한 링크에는 답이 없습니다. 또한 .net 코어 3.0은 약간 다릅니다.
Mehrdad Babaki '10

답변은 링크 된 질문에 대한 답변에서 설명한대로 .AddSecurityRequirement(전역 적으로) 또는 .Security(작업 수준에서 ) 추가하는 것입니다 . AddSecurityDefinition혼자서는 충분하지 않습니다.
Helen

나는 추가했지만 아무것도 바뀌지 않았다. 그것이 답변으로 선택되지 않은 이유라고 생각합니다.
Mehrdad Babaki '10

나는 최근에 또 다른 질문에 이것을 대답했다 : 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[] { } 
    } 
  });
});

많은 감사, 그것은 나와 함께 잘 작동
Anas Al-Qudah

2
팁 : 실제 토큰 앞에 "베어러"를 쓰는 것을 잊지 마십시오. 그리고 텍스트 상자에 쓴 내용에 관계없이 swagger가 항상 권한을 부여했다고 말하는 것은 약간 성가시다.
CodeHacker 2016

이것은 net core 3과 swagger에서 작동합니다
ericpap

생명을 구하는 사람은 세상을 구합니다. 내 생명을 구했다 ;-) 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를 아이디 서버에 전달하면서 범위를 선택할 수있게하려면 다음과 같이 추가하면됩니다.

암시 적 흐름을 사용했지만 다음 메커니즘을 사용하여 흐름을 구성 할 수 있습니다.

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

다음은 Bearer 토큰을 사용하여 보안 된 API로 IdentityServer4와 통합 된 Swashbuckle.AspNetCore 5.3.2에 대한 솔루션입니다.

에서 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 인증 사용

추신 : 원래 질문은 SwashBuckle에 대한 것이지만 Google은 NSwag를 검색 할 때이 링크를 먼저 표시합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.