gpt4 book ai didi

c# - 使用 Ajax 处理 AntiForgeryToken 发送

转载 作者:行者123 更新时间:2023-12-05 09:23:22 29 4
gpt4 key购买 nike

你好,我正在关注 this tutorial:

我正在尝试发送包含 AntiforgeryToken 的 Ajax 请求。这是我的 ajax 请求:

$(document).ready(function () {
@functions{
public string TokenHeaderValue()
{
string cookieToken, formToken;
AntiForgery.GetTokens(null, out cookieToken, out formToken);
return cookieToken + ":" + formToken;
}
}
$('.z').on('click', function (event) {
event.preventDefault();
$.ajax({
url: "/DeviceUsage/Return",
type: "POST",
contentType: "application/json; charset=utf-8",
dataType: 'html',
headers: {
'RequestVerificationToken': '@TokenHeaderValue()'
},
data: JSON.stringify({ dev: { DeviceInstanceId: $('#DeviceInstanceId').val(), UserId: "1", StorageId: $('#StorageId').val() } }),
error: function (data) {
alert("wystąpił nieokreślony błąd " + data);
},
success: function (data) {
$('.modal-body').html(data);
}
})
})
});

这里是我的 Controller :

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Return(DeviceUsage dev)
{
if(dev.StorageId==3)
{
ModelState.AddModelError("", "Nie można oddać na własne biurko");
ViewBag.StorageId = new SelectList(unitOfWork.storageRepository.Get(), "Id", "Name", dev.StorageId);
return PartialView(dev);
}
dev.UserId = 1;
unitOfWork.deviceUsageRepository.Update(dev);
unitOfWork.Save();
return RedirectToAction("MyDevices");
}

但在本教程中,它们显示的功能如下:

void ValidateRequestHeader(HttpRequestMessage request)
{
string cookieToken = "";
string formToken = "";

IEnumerable<string> tokenHeaders;
if (request.Headers.TryGetValues("RequestVerificationToken", out tokenHeaders))
{
string[] tokens = tokenHeaders.First().Split(':');
if (tokens.Length == 2)
{
cookieToken = tokens[0].Trim();
formToken = tokens[1].Trim();
}
}
AntiForgery.Validate(cookieToken, formToken);
}

但我不知道将这段代码放在我的 Controller 中的什么位置以及如何调用这个函数。谁能解释一下如何使用上面的代码?

最佳答案

他们在教程的Anti-CSRF and AJAX 部分展示的是一种非标准的 token 验证方法。在此示例中,您将使用[ValidateAntiForgeryToken],而是手动运行验证。首先,您在 ajax 调用中注入(inject)额外的 header :

        headers: {
'RequestVerificationToken': '@TokenHeaderValue()'
},

然后在您的操作中从 header 中读取并验证 token :

[HttpPost]
public ActionResult Return(DeviceUsage dev)
{
ValidateRequestHeader(Request);
//process action
}
void ValidateRequestHeader(HttpRequestBase request)
{
string cookieToken = "";
string formToken = "";

if (request.Headers["RequestVerificationToken"] != null)
{
string[] tokens = request.Headers["RequestVerificationToken"].Split(':');
if (tokens.Length == 2)
{
cookieToken = tokens[0].Trim();
formToken = tokens[1].Trim();
}
}
AntiForgery.Validate(cookieToken, formToken);
}

请注意,ValidateRequestHeader() 读取先前由 jQuery 调用设置的 header 。另外,我稍微修改了方法以接受 HttpRequestBase

提示:为避免将 ValidateRequestHeader() 添加到响应 ajax 调用的每个 Controller ,请将其添加到您的基本 Controller (如果有),并从该基本 Controller 派生所有 Controller 。或者更好 create你自己的 [ValidateAntiForgeryAjaxToken] 属性。

关于c# - 使用 Ajax 处理 AntiForgeryToken 发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22222078/

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