Ajax POST для защиты от подделки с предварительным запросом CORS OPTIONS (перенаправление 302)

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

$.ajaxPrefilter(function (options, localOptions, jqXHR) {
    if (options.type == "POST") {
        var token = GetAntiForgeryToken();
        jqXHR.setRequestHeader(token.name, token.value);
    }
});

На сайте также есть инструменты администратора, если вы вошли в систему как администратор, который использует CORS для отправки данных на отдельный сайт администратора. Одним из таких инструментов является почтовый запрос AJAX. Заголовок добавлен в запрос и работает корректно.

Другой инструмент — это запрос GET, который возвращает форму, отображаемую в диалоговом окне. Это прекрасно работает. Однако, когда форма отправлена, запрос OPTIONS предварительной проверки соответствует 302, и я получаю сообщение об ошибке «Ответ для предварительной проверки недействителен (перенаправление)».

Если я удалю ajaxPrefilter, сообщение формы будет работать, а запрос прямого сообщения - нет. При включенном предварительном фильтре прямой запрос на публикацию работает, а публикация в форме — нет. Я довольно потерян. Заголовок защиты от подделки разрешен в Access-Control-Allow-Headers. Запросы для обоих:

OPTIONS http://localhost:64789/Example/Example/?_=1464356730712 HTTP/1.1
Host: localhost:64789
Connection: keep-alive
Access-Control-Request-Method: POST
Origin: http://localhost:64947
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36
Access-Control-Request-Headers: __requestverificationtoken, accept, content-type
Accept: */*
Referer: http://localhost:64947/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6

Этот возвращает 302.

OPTIONS http://localhost:64789/Example2/Example2/ HTTP/1.1
Host: localhost:64789
Connection: keep-alive
Access-Control-Request-Method: POST
Origin: http://localhost:64947
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36
Access-Control-Request-Headers: __requestverificationtoken, accept, content-type
Accept: */*
Referer: http://localhost:64947/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6

Этот возвращает 200.

Любая помощь будет действительно полезной.


person Bonnotbh    schedule 27.05.2016    source источник
comment
Ваш вопрос не прямой. пожалуйста, предоставьте только общие и полезные части...   -  person ReZa    schedule 03.06.2016


Ответы (2)


Это было исправлено путем добавления атрибута [HttpGet] в метод получения формы.

person Bonnotbh    schedule 07.06.2016

Я думаю, что вы забыли отправить заголовок типа содержимого для сообщения формы. Попробуйте добавить некоторые типы контента из этого ответа: https://stackoverflow.com/a/35452170/1727132

person Jehy    schedule 06.06.2016