2016-06-28 6 views
1

OAIN2를 사용하여 사용자를 인증하기 위해 OWIN 미들웨어를 사용하여 Visual Studio 2012에서 최근에 Web API 2 프로젝트를 시작했습니다. this tutorial (Token Based Authentication)에 설명 된대로 토큰 기반 인증을 통합했습니다. 인증 부분은 훌륭하게 작동합니다. 몇 가지 테스트 API 메소드를 추가했으며 API 문서에 대해 Swagger를 연결하려고했습니다. Swagger API 호출이 권한 부여에 실패하는 것을 제외하고는 그 부분도 작동합니다.POST OAuth2 인증 요청을 위해 Web API 2에서 Swagger를 구성하는 방법은 무엇입니까?

조사한 결과, OWIN 미들웨어에 Swagger를 연결하는 방법에 대해 Erik Dahl's post이 발견되었습니다. 게시물에 따라 Swagger를 구성한 후에 각 API 메소드 옆에있는 Swagger UI에서 인증 버튼을 볼 수 있습니다. 그러나 인증을 시도 할 때 Swagger 내의 인증은 GET 요청을 사용하여 수행됩니다. 웹 API 인증은 POST 요청이 필요합니다. Swagger를 구성하여 인증 요청을 POST로 할 수 있습니까? 그렇지 않은 경우 내 API가 토큰 인증을위한 GET 요청을 수락하도록 허용해야합니까? 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

참고 : 요청은 여전히 ​​내 인증 논리에 부딪치지 만 POST 요청에서만 client_id 및 client_secret은 GET 요청에 전달되지 않습니다. 여기

httpConfig 
    .EnableSwagger(c => 
    { 
     c.SingleApiVersion("v1", "Sample API"); 

     c.ApiKey("token") 
      .Description("API Key Authentication") 
      .Name("Bearer") 
      .In("header"); 

     c.OAuth2("oauth2") 
      .AuthorizationUrl("/oauth/token") 
      .Flow("implicit") 
      .Description("OAuth2 authentication") 
      .Scopes(scopes => 
      { 
       scopes.Add("sampleapi", "Sample API"); 
      }); 


     c.OperationFilter<AssignOAuth2SecurityRequirements>(); 
    }) 
    .EnableSwaggerUi(c => 
    { 
     c.EnableOAuth2Support(
      clientId: "Sample_App", 
      clientSecret: "xxxxx", 
      realm: "test-realm", 
      appName: "Swagger UI"); 
    }); 

그리고 내 OAuth는 설정은 다음과 같습니다 :

app.CreatePerOwinContext<ApiClientRepo>(ApiClientRepo.Create); 
app.CreatePerOwinContext<MeetingRegistrantRepo>(MeetingRegistrantRepo.Create); 

OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions() 
{ 
    //For Dev enviroment only (on production should be AllowInsecureHttp = false) 
    AllowInsecureHttp = true, 
    TokenEndpointPath = new PathString("/oauth/token"), 
    AccessTokenExpireTimeSpan = TimeSpan.FromDays(1), 
    Provider = new CustomOAuthProvider(), 
    AccessTokenFormat = new CustomJwtFormat("http://localhost:51071"), 
    RefreshTokenProvider = new SimpleRefreshTokenProvider() 
}; 

// OAuth 2.0 Bearer Access Token Generation 
app.UseOAuthAuthorizationServer(OAuthServerOptions); 

답변

1

아니, 난 그냥 허세를 만족에 도착하는 POST에서 인증 방법을 변경하지 않을

여기 내 자신감의 설정입니다.

http://danielwertheim.se/use-identityserver-in-swaggerui-to-consume-a-secured-asp-net-webapi/ 그것은 그 방법을 시도 할 가치가있을 고원 :

나는 당신이 당신이하고 싶은 일을 할 수 있도록해야 다른 기사를 발견했다. POST에서 GET으로 변경한다는 것은 요청 본문의 매개 변수를 더 이상 전달할 수 없다는 것을 의미하며 대신 요청 URL에서 매개 변수를 수행해야하므로 모든 것을 안전하지 않게 만듭니다.

예, ClientID와 ClientSecret은 여전히 ​​인증 헤더에 포함되지만 여전히 이와 같은 내용은 사용하지 않습니다. Swagger는 API의 아키텍처를 지정해서는 안되므로 거기에 가지 마십시오.

+0

Andrei, 답안의 기사가 내 목표에 대한 가능한 해결 방법을 제공하지만 필자는 모든 수하물을 프로젝트에 추가하고 싶지 않습니다. 그것은 작은 프로젝트이고 Swagger 설정을 수정하기위한 쉬운 해결책이 없다면 웹 API의 도움말 페이지 만 사용할 것이라고 생각했습니다. API 문서에 충분한 정보를 제공합니다. 나는 그 길을 대신 택할 것이라고 믿는다. 그리고 네, 동의합니다. POST에서 GET으로 인증 방법을 변경하지 않을 것입니다. – Sebbo