C# 如何通过jquery ajax发送AntiForgeryToken(CSRF)和FormData
因此,我想通过AJAX将C# 如何通过jquery ajax发送AntiForgeryToken(CSRF)和FormData,c#,jquery,ajax,asp.net-mvc,asp.net-mvc-5,C#,Jquery,Ajax,Asp.net Mvc,Asp.net Mvc 5,因此,我想通过AJAX将POSTfileUpload与AntiForgeryToken一起上传。这是我的密码: 看法 我明白了 无法解密防伪令牌。如果此应用程序由Web场或群集托管 通过小提琴的错误。你知道如何解决这个问题吗 我找到了答案: <script> $(document).ready(function(){ $('#btnRXUpload').click(function () { var form =
POST
fileUpload与AntiForgeryToken
一起上传。这是我的密码:
看法
我明白了
无法解密防伪令牌。如果此应用程序由Web场或群集托管
通过小提琴的错误。你知道如何解决这个问题吗
我找到了答案:
<script>
$(document).ready(function(){
$('#btnRXUpload').click(function () {
var form = $('#frmRXUpload')
if (form.valid()) {
var formData = new FormData(form.get(0)); //add .get(0)
formData.append('files', $('#frmRXUpload input[type="file"]')[0].files[0]);
$.ajax({
type: 'POST',
url: '/RX/Upload',
data: formData,
contentType: false,
processData: false
})
}
})
})
</script>
$(文档).ready(函数(){
$('#btnRXUpload')。单击(函数(){
变量形式=$(“#frmRXUpload”)
if(form.valid()){
var formData=new formData(form.get(0));//add.get(0)
formData.append('files',$('frmRXUpload input[type=“file”]')[0]。files[0]);
$.ajax({
键入:“POST”,
url:“/RX/Upload”,
数据:formData,
contentType:false,
processData:false
})
}
})
})
您需要将令牌添加到请求头,而不是表单。像这样:
if (form.valid()) {
var formData = new FormData(form);
formData.append('files', $('#frmRXUpload input[type="file"]')[0].files[0]);
$.ajax({
type: 'POST',
url: '/RX/Upload',
data: formData,
contentType: 'multipart/form-data',
processData: false,
headers: {
'__RequestVerificationToken': fnGetToken()
}
})
}
编辑
回顾我自己是如何解决这个问题的,我记得标准的ValidateAntiForgeryTokenAttribute在Request.Form对象中查找,它并不总是为AJAX请求填充。(在您的情况下,文件上载需要多部分/表单数据
内容类型,而CSRF令牌的表单帖子需要应用程序/x-www-form-urlencoded
。您设置了contentType=false
,但这两个操作需要冲突的内容类型,这可能是您的问题的一部分)。因此,为了验证服务器上的令牌,您需要为您的操作方法编写一个自定义属性,用于检查请求标头中的令牌:
public sealed class ValidateJsonAntiForgeryTokenAttribute
: FilterAttribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
var httpContext = filterContext.HttpContext;
var cookie = httpContext.Request.Cookies[AntiForgeryConfig.CookieName];
AntiForgery.Validate(cookie != null ? cookie.Value : null,
httpContext.Request.Headers["__RequestVerificationToken"]);
}
}
更多信息(现在有点过时) 终于找到了答案:
<script>
$(document).ready(function(){
$('#btnRXUpload').click(function () {
var form = $('#frmRXUpload')
if (form.valid()) {
var formData = new FormData(form.get(0)); //add .get(0)
formData.append('files', $('#frmRXUpload input[type="file"]')[0].files[0]);
$.ajax({
type: 'POST',
url: '/RX/Upload',
data: formData,
contentType: false,
processData: false
})
}
})
})
</script>
我只需要在表单中添加。获取(0)
,以下是代码:
<script>
$(document).ready(function(){
$('#btnRXUpload').click(function () {
var form = $('#frmRXUpload')
if (form.valid()) {
var formData = new FormData(form.get(0)); //add .get(0)
formData.append('files', $('#frmRXUpload input[type="file"]')[0].files[0]);
//formData.append('__RequestVerificationToken', fnGetToken()); //remark this line
$.ajax({
type: 'POST',
url: '/RX/Upload',
data: formData,
contentType: false,
processData: false
})
}
})
})
</script>
$(文档).ready(函数(){
$('#btnRXUpload')。单击(函数(){
变量形式=$(“#frmRXUpload”)
if(form.valid()){
var formData=new formData(form.get(0));//add.get(0)
formData.append('files',$('frmRXUpload input[type=“file”]')[0]。files[0]);
//append(“\uu RequestVerificationToken',fGetToken());//注释此行
$.ajax({
键入:“POST”,
url:“/RX/Upload”,
数据:formData,
contentType:false,
processData:false
})
}
})
})
什么是fGetToken()
?如果应用程序未托管在Web场或群集上,此行为是否会改变?非ajax请求有效吗?@StephenMuecke:一个获取令牌stringYes的函数,但它返回什么?为什么不直接使用var formdata=newformdata($('form').get(0))
根据我对您的某个问题的答案?错误消息表明它可能与令牌的某个答案有关,可以将其添加到FormData
。如果OP的当前代码不起作用,那么这也不会起作用。
<script>
$(document).ready(function(){
$('#btnRXUpload').click(function () {
var form = $('#frmRXUpload')
if (form.valid()) {
var formData = new FormData(form.get(0)); //add .get(0)
formData.append('files', $('#frmRXUpload input[type="file"]')[0].files[0]);
//formData.append('__RequestVerificationToken', fnGetToken()); //remark this line
$.ajax({
type: 'POST',
url: '/RX/Upload',
data: formData,
contentType: false,
processData: false
})
}
})
})
</script>