gpt4 book ai didi

jquery - 是否可以在 XMLHttpRequest header 中包含 antiforgerytoken?

转载 作者:行者123 更新时间:2023-12-01 00:21:46 25 4
gpt4 key购买 nike

我正在使用一个名为 Slim 的库,将图像上传到我的 asp.net MVC 项目。

JQuery 库使用 XMLHttpRequest 向服务器发送请求,我已经阅读了所有手册,但没有任何关于如何向服务器包含防伪造 token 的内容。

所以我在发送之前手动添加了这一行:

data.__RequestVerificationToken = $('input[name="__RequestVerificationToken"]').val();

即使 token 包含在数据中,Asp.net MVC 过滤器:ValidateJsonAntiForgeryTokenAttribute 也无法识别它,因为它期望 token 位于 header 中>。这是服务器上的验证代码:

AntiForgery.Validate(cookie != null ? cookie.Value : null,
httpContext.Request.Headers["__RequestVerificationToken"]);

这是库的发送函数,其中包含我在底部添加的额外行以包含 token 。如何在 header 中包含 token ?

var send = function send(url, data, requestDecorator, progress, success, err) {

var xhr = new XMLHttpRequest();

// if progress callback defined handle progress events
if (progress) {
xhr.upload.addEventListener('progress', function (e) {
progress(e.loaded, e.total);
});
}

// open the request
xhr.open('POST', url, true);

// if request decorator defined pass XMLHttpRequest instance to decorator
if (requestDecorator) {
requestDecorator(xhr);
}

// handle state changes
xhr.onreadystatechange = function () {

if (xhr.readyState === 4 && xhr.status >= 200 && xhr.status < 300) {

var text = xhr.responseText;

// if no data returned from server assume success
if (!text.length) {
success();
return;
}

// catch possible PHP content length problem
if (text.indexOf('Content-Length') !== -1) {
err('file-too-big');
return;
}

// if data returned it should be in suggested JSON format
var obj = void 0;
try {
obj = JSON.parse(xhr.responseText);
} catch (e) {}

// if is failure response
if ((typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && obj.status === 'failure') {
err(obj.message);
return;
}

success(obj || text);
} else if (xhr.readyState === 4) {

var _obj = void 0;
try {
_obj = JSON.parse(xhr.responseText);
} catch (e) {}

// if is clean failure response
if ((typeof _obj === 'undefined' ? 'undefined' : _typeof(_obj)) === 'object' && _obj.status === 'failure') {
err(_obj.message);
return;
}

err('fail');
}
};

// I have added this line to library to include anti forgery token
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
data.__RequestVerificationToken = $('input[name="__RequestVerificationToken"]').val();

// do request
xhr.send(data);

};`

最佳答案

您需要在 header 中设置 antiforgerytoken,如下所示:

xhr.setRequestHeader('__RequestVerificationToken', $('input[name="__RequestVerificationToken"]').val());

参见XMLHttpRequest.setRequestHeader有关 XMLHttpRequest 的更多信息:

要验证 header 中传递的 AntiforgeryToken,在 Controller 中,您需要创建自己的过滤器,如下所示:

[HttpPost]
[ValidateJsonAntiForgeryToken]
public ActionResult MySlimAction()
{
/* your Save controller logic goes here */
}

将此过滤器定义作为新类添加到“过滤器”文件夹中:

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false, Inherited = 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"]);
}
}

如果是您的特定库,Slim Image Cropper ,您可以在初始化 Slim 时使用 willRequest 回调:

var cropper = $('#my-cropper-selector').slim({
willRequest: function (xhr) {
xhr.setRequestHeader('__RequestVerificationToken', $('input[name="__RequestVerificationToken"]').val());
},
ratio: 'free',
push: true,
service: '/MyController/MySlimAction'
/* other options go here */
});

关于jquery - 是否可以在 XMLHttpRequest header 中包含 antiforgerytoken?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47985723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com