2017-10-16 7 views
1

this tutorial 다음에 내 사이트에 Swagger and Swashbuckle generator를 추가했습니다. 이제 https://localhost:port/swagger/으로 이동하면 생성 된 API 문서를 볼 수 있습니다. 참고로, 나는 SwaggerController 클래스를 만들지 않았습니다 - 이것은 모두 NuGet 패키지에 의해 처리됩니다.ASP.NET 코어 2.0 : 컨트롤러없이 경로를 인증하십시오.

문제는 내 전체 사이트, 심지어 API가 사용자 지정 LDAP를 사용하여 인증된다는 것입니다. /swagger/ 페이지도 보호하고 싶습니다. 그러나, 나는 그것을하는 방법을 찾지 못했습니다. StackOverflow에 관한 유일한 질문은 전체 API 문서 페이지를 인증하지 않고 adding authentication INTO swagger requests입니다.

생성 된 /swagger/ 페이지를 보호하는 구체적인 방법이 있습니까? 또는 ASP.NET Core 2.0 MVC 경로에 인증 유효성 검사기를 추가하는 일반적인 방법이 있습니까?

답변

2

아래와 같이 파이프 라인에 추가 한 후 사용자 정의 미들웨어 핸들러를 만들고 :

Startup.cs을

public void Configure(IApplicationBuilder app, IHostingEnvironment env) 
     { 
      if (env.IsDevelopment()) 
      { 
       app.UseDeveloperExceptionPage(); 
      } 
      app.UseMvc(); 
      app.UseStaticFiles(); 

      //And here's where the middleware is registered 
      app.UseRequestAuthHandler(); 
      app.UseSwaggerUI(c => 
      { 
       c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"); 
      }); 
     } 

미들웨어 클래스 :

namespace SwaggerDemo.Handlers 
{ 
    using System.Net; 
    using System.Threading.Tasks; 

    using Microsoft.AspNetCore.Builder; 
    using Microsoft.AspNetCore.Http; 

    public class RequestAuthHandler 
    { 
     private const string _swaggerPathIdentifier = "swagger"; 
     private readonly RequestDelegate _next; 

     public RequestAuthHandler(RequestDelegate next) 
     { 
      _next = next; 
     } 

     public async Task Invoke(HttpContext context) 
     { 
      // First check if the current path is the swagger path 
      if (context.Request.Path.HasValue && context.Request.Path.Value.ToLower().Contains(_swaggerPathIdentifier)) 
      { 
       // Secondly check if the current user is authenticated 
       if (!context.User.Identity.IsAuthenticated) 
       { 
        context.Response.StatusCode = (int)HttpStatusCode.Unauthorized; 
        return; 
       } 
      } 
      await _next.Invoke(context); 
     } 
    } 

    public static class RequestAuthHandlerExtension 
    { 
     public static IApplicationBuilder UseRequestAuthHandler(this IApplicationBuilder builder) 
     { 
      return builder.UseMiddleware<RequestAuthHandler>(); 
     } 
    } 
}