Ajax anti-forgery POST 带有 CORS 预检选项请求(302 重定向)

Ajax anti-forgery POST with CORS preflight OPTIONS request (302 redirect)

我最近更新了我正在处理的网站,以检查所有 POST 请求的 anti-forgery 令牌。对于 ajax 请求,我放置了一个预过滤器来检查防伪令牌并将其添加到 headers

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

当以管理员身份登录时,该站点还有管理工具,使用 CORS 将数据发送到单独的管理站点。这些工具之一是 AJAX post 请求。 header 被添加到请求中并且它工作正常。

另一个工具是 GET 请求,它 returns 一个显示在对话框中的表单。这很好用。但是,当提交表单时,预检选项请求遇到 302,我收到错误 "Response for preflight is invalid (redirect)"

如果我删除 ajaxPrefilter,post 形式有效,但直接 post 请求无效。启用预过滤器后,直接 post 请求有效,但形式 post 无效。我很迷路。 Access-Control-Allow-Headers 允许防伪 header。两者的请求是:

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

这个returns302.

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

这个returns200个。

任何帮助都会非常有用。

我认为您忘记发送 content-type header 表格 post。尝试从这个答案中添加一些 content-type:https://whosebug.com/a/35452170/1727132

已通过向表单的 get 方法添加 [HttpGet] 属性解决此问题。