2016-06-28 8 views
1

Недавно я начал проект Web API 2 в Visual Studio 2012 с использованием промежуточного программного обеспечения OWIN для аутентификации пользователей с помощью OAuth2. Я включил аутентификацию на основе токенов, как описано в разделе this tutorial (Token Based Authentication). Часть аутентификации отлично работает. Я добавил некоторые методы тестирования API, и я хотел подключить Swagger для документации по API. Я тоже заработал эту часть, за исключением того, что API-вызовы от Swagger терпят неудачу при авторизации.Как настроить Swagger в Web API 2 на запрос аутентификации POST OAuth2?

После исследования я нашел Erik Dahl's post о том, как подключить Swagger к промежуточному программному обеспечению OWIN. После того, как я настроил свой Swagger в соответствии с постами, теперь я вижу кнопки аутентификации в пользовательском интерфейсе Swagger рядом с каждым методом API. Однако при попытке аутентификации аутентификация внутри Swagger выполняется с использованием запроса GET. Аутентификация в веб-API, хотя требует, чтобы это был запрос POST. Возможно ли настроить Swagger для запроса аутентификации POST? Если нет, должен ли я разрешить моему API принимать запросы GET для аутентификации маркера? Какой был бы лучший подход для выполнения этой работы?

Примечание: запрос по-прежнему удаляет мою логику аутентификации, но client_id и client_secret не передаются в запросе GET только в запросе POST.

Вот мой Кураж конфигурации:

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 на GET только для удовлетворения Swagger.

я нашел другую статью, которая должна помочь вам сделать то, что вы хотите сделать здесь: http://danielwertheim.se/use-identityserver-in-swaggerui-to-consume-a-secured-asp-net-webapi/

Это пустошь стоит попробовать его таким образом. Не забывайте, что переход от POST к GET означает, что вы больше не можете передавать параметры в теле запроса, и вместо этого вам придется делать это по URL-адресу запроса, и это делает все небезопасным.

Да, ClientID и ClientSecret по-прежнему будут частью заголовка авторизации, но до сих пор не открывают себя так. Swagger не должен диктовать архитектуру вашего API, поэтому не туда.

+0

Андрей, хотя статья в вашем ответе дает возможное обходное решение для моей цели, я не чувствую, что хочу добавить весь этот багаж в проект. Это небольшой проект, и я решил, что нет простого решения для изменения конфигурации Swagger, я просто использую страницы справки веб-API. Они предоставляют достаточную информацию для моей документации по API. Я считаю, что я выберу этот маршрут. И да, я согласен с вами, я бы не изменил метод auth из POST для GET. – Sebbo