2016-07-05 2 views
9

Я много искал в Google и переполнении стека, чтобы найти решение для моей проблемы, но ничего не получилось.Запрос предварительной проверки CORS, возвращающий HTTP 401 с проверкой подлинности Windows

Вот моя проблема:

  • Я использую IIS 7 со специальной средой программирования под названием Webdev, которая не позволяет прямое манипулирование OPTIONS метода HTTP. Таким образом, все решения, предлагающие какую-либо обработку запросов на стороне сервера с использованием кода, невозможны.

  • Я должен использовать проверку подлинности окна и отключить анонимный доступ

  • У меня есть страница, которая использует CORS для POST к этому серверу. Поскольку этот POST должен иметь Content-type: Octet-stream, предполетный период выдается браузером.

  • Когда я разрешить анонимный доступ, все работает отлично (CORS хорошо настроен)

  • Когда я отключить анонимный доступ, сервер отвечает HTTP 401 несанкционированный ответ на предполетной просьбу, так как она не содержит учетные данные Информация.

  • Я попытался написать модуль для IIS, который принимает OPTIONS запросы, как это, но он не работает (не может добавить модуль правильно IIS, может быть)

    public class CORSModule : IHttpModule 
        { 
    
          public void Dispose() { 
          } 
    
          public void Init(HttpApplication context) 
          { 
           context.PreSendRequestHeaders += delegate 
           { 
            if (context.Request.HttpMethod == "OPTIONS") 
            { 
             var response = context.Response; 
             response.StatusCode = (int)HttpStatusCode.OK; 
            } 
           }; 
          } 
        } 
    

на вопрос is: Как я могу заставить IIS отвечать HTTP 200 на запрос предполетной сессии без включения анонимного доступа или написания кода на стороне сервера? Есть ли простая конфигурация или готовый модуль для IIS? По крайней мере, какие подробные шаги по установке вышеуказанного модуля в IIS 7?

ответ

7

Вот решение, которое использует модуль IIS для перезаписи URL-адресов. Он работает отлично.

служба

1- Остановить IIS (возможно, нет необходимости)

2 Установка «веб-платформы установки» на вкладке https://www.microsoft.com/web/downloads/platform.aspx

3 Перейти к «Приложения» и поиск «URL Rewrite» и загрузить его

4- установить это исправление KB2749660 (может быть, не необходимое)

5- Открыть инструмент конфигурации IIS, двойной щелчок "URL Rewrite"

6- Добавить новый blankrule

7- дать любое имя

8- В "URL Match", укажите этот шаблон: .*

9- В "Условия" укажите эту запись условие : {REQUEST_METHOD} и эта модель: ^OPTIONS$

10- В "Action", указать: тип действия Personalized response, код состояния 200, причина Preflight, описание Preflight

11- Запустить сервер

Теперь сервер должен ответить с ответом кода состояния 200 на запрос предполетной проверки, независимо от аутентификации.

Примечания: Я также отключил все сжатие, я не знаю, имеет ли это значение.

+2

жизни заставки братан +1 –

0

Для того, чтобы ваш модуль имел приоритет, он должен будет переопределить любые модули внутри IIS, которые могут мешать. Например, вашему web.config может понадобиться аноним или разрешить анонимность, а также создать атрибут для перехвата трафика и фильтрации, как вам нужно.

4

От ответа AhmadWabbi, легкий в XML приклеить в Ваш web.config:

<system.webServer> 
    <rewrite> 
     <rules> 
      <rule name="CORS Preflight Anonymous Authentication" stopProcessing="true"> 
       <match url=".*" /> 
       <conditions> 
        <add input="{REQUEST_METHOD}" pattern="^OPTIONS$" /> 
       </conditions> 
       <action type="CustomResponse" statusCode="200" statusReason="Preflight" statusDescription="Preflight" /> 
      </rule> 
     </rules> 
    </rewrite> 
</system.webServer>