OAuth Swashbuckle завершается ошибкой, когда ответ возвращается в o2c-html

Мой супер простой пример приложения Web API успешно рендерит документ swagger/ui. Но он не работает, если я пытаюсь настроить его для выполнения авторизованных вызовов OAuth 2.0.

Если вы нажмете значок, чтобы отобразить запрос согласия OAuth, а затем нажмите Authorize кнопка, я успешно перенаправлен на login.microsoftonline.com и я могу успешно предоставить учетные данные, но, когда я перенаправлен обратно в swagger/ui/o2c-htmlКажется, что динамически генерируемый JavaScript на этой странице глючит...

Сгенерирована страница "o2c-html":

<script>
    var qp = null;
    if(window.location.hash) {
      qp = location.hash.substring(1);
    }
    else {
      qp = location.search.substring(1);
    }
    qp = qp ? JSON.parse('{"' + qp.replace(/&/g, '","').replace(/=/g,'":"') + '"}',
      function(key, value) {
        return key===""?value:decodeURIComponent(value) }
      ):{}

    if (window.opener.swaggerUi.tokenUrl)
        window.opener.processOAuthCode(qp);
    else
        window.opener.onOAuthComplete(qp);

    window.close();
</script>

Когда я наведите курсор на qp переменная, я вижу, что я успешно получил требуемый токен на предъявителя, но, по мере выполнения, продолжается до окончательных условных операторов с window.opener все терпит неудачу в window.opener.swaggerui

Я получаю следующую ошибку:

Ошибка времени выполнения JavaScript: не удалось получить свойство 'swaggerUi' с неопределенной или нулевой ссылкой

Я использую эти пакеты NuGet, FWIW:

  <package id="Swashbuckle" version="5.5.3" targetFramework="net45" />

ОБНОВЛЕНИЕ - выяснил, что я ошибся

В моем случае у меня не было правильной конфигурации в SwaggerConfig.cs в первом разделе EnableSwagger(c =>:

Первоначально я настроил это так (не спрашивайте меня почему):

c.OAuth2("oauth2")
  .Description("OAuth2 Implicit Grant")
  .Flow("implicit") 
  .AuthorizationUrl(
  string.Format("https://login.microsoftonline.com/{0}/oauth2/authorize", 
   ConfigurationManager.AppSettings["ida:Tenant"]))
   .Scopes(scopes =>
   {
       scopes.Add("user_impersonation", "Access swagger");
   });

Но теперь все это работает, когда я изменил его на исчерпывающий список моих реальных ролей, которые я использую в своих контроллерах...

c.OAuth2("oauth2")
.Description("OAuth2 Implicit Grant")
.Flow("implicit")
.AuthorizationUrl(
 string.Format("https://login.microsoftonline.com/{0}/oauth2/authorize",
 ConfigurationManager.AppSettings["ida:Tenant"]))
 .Scopes(scopes =>
 {
    scopes.Add("AdminAccess", "Admin access to protected resources");
    scopes.Add("FullAccess", "Full access to protected resources");
    scopes.Add("UpdateAccess", "Update access to protected resources");
    scopes.Add("ReadAcces", "Read access to protected resources");
 });

1 ответ

Решение

Извините, это ошибка в Swagger-UI.

Последняя версия выглядит иначе, посмотрите здесь: src / main / html / o2c.html

Нам просто нужно опубликовать новый пакет NuGet Swashbuckle (надеюсь, скоро)

Другие вопросы по тегам