首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在ajax post ASP.NET MVC中包含反伪造令牌

在ajax post ASP.NET MVC中包含反伪造令牌
EN

Stack Overflow用户
提问于 2013-01-23 14:18:36
回答 12查看 196.9K关注 0票数 189

我在使用ajax的AntiForgeryToken时遇到了问题。我使用的是ASP.NET MVC3,我在jQuery Ajax calls and the Html.AntiForgeryToken()中尝试过这个解决方案。使用该解决方案,现在可以传递令牌:

代码语言:javascript
复制
var data = { ... } // with token, key is '__RequestVerificationToken'

$.ajax({
        type: "POST",
        data: data,
        datatype: "json",
        traditional: true,
        contentType: "application/json; charset=utf-8",
        url: myURL,
        success: function (response) {
            ...
        },
        error: function (response) {
            ...
        }
    });

当我删除[ValidateAntiForgeryToken]属性只是为了查看数据(带有令牌)是否作为参数传递给控制器时,我可以看到它们正在被传递。但由于某些原因,当我将属性放回原处时,仍然弹出A required anti-forgery token was not supplied or was invalid.消息。

有什么想法吗?

编辑

antiforgerytoken是在表单中生成的,但我没有使用提交操作来提交它。相反,我只是使用jquery获取令牌的值,然后尝试ajax post。

下面是包含令牌的表单,位于顶部主页:

代码语言:javascript
复制
<form id="__AjaxAntiForgeryForm" action="#" method="post">
    @Html.AntiForgeryToken()
</form>
EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2013-01-23 14:32:13

您错误地指定了application/jsoncontentType

这是一个如何工作的示例。

控制器:

代码语言:javascript
复制
public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Index(string someValue)
    {
        return Json(new { someValue = someValue });
    }
}

查看:

代码语言:javascript
复制
@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "__AjaxAntiForgeryForm" }))
{
    @Html.AntiForgeryToken()
}

<div id="myDiv" data-url="@Url.Action("Index", "Home")">
    Click me to send an AJAX request to a controller action
    decorated with the [ValidateAntiForgeryToken] attribute
</div>

<script type="text/javascript">
    $('#myDiv').submit(function () {
        var form = $('#__AjaxAntiForgeryForm');
        var token = $('input[name="__RequestVerificationToken"]', form).val();
        $.ajax({
            url: $(this).data('url'),
            type: 'POST',
            data: { 
                __RequestVerificationToken: token, 
                someValue: 'some value' 
            },
            success: function (result) {
                alert(result.someValue);
            }
        });
        return false;
    });
</script>
票数 319
EN

Stack Overflow用户

发布于 2013-04-17 18:23:29

我使用的另一种(更少javascriptish)方法是这样的:

首先,一个Html帮助程序

代码语言:javascript
复制
public static MvcHtmlString AntiForgeryTokenForAjaxPost(this HtmlHelper helper)
{
    var antiForgeryInputTag = helper.AntiForgeryToken().ToString();
    // Above gets the following: <input name="__RequestVerificationToken" type="hidden" value="PnQE7R0MIBBAzC7SqtVvwrJpGbRvPgzWHo5dSyoSaZoabRjf9pCyzjujYBU_qKDJmwIOiPRDwBV1TNVdXFVgzAvN9_l2yt9-nf4Owif0qIDz7WRAmydVPIm6_pmJAI--wvvFQO7g0VvoFArFtAR2v6Ch1wmXCZ89v0-lNOGZLZc1" />
    var removedStart = antiForgeryInputTag.Replace(@"<input name=""__RequestVerificationToken"" type=""hidden"" value=""", "");
    var tokenValue = removedStart.Replace(@""" />", "");
    if (antiForgeryInputTag == removedStart || removedStart == tokenValue)
        throw new InvalidOperationException("Oops! The Html.AntiForgeryToken() method seems to return something I did not expect.");
    return new MvcHtmlString(string.Format(@"{0}:""{1}""", "__RequestVerificationToken", tokenValue));
}

它将返回一个字符串

代码语言:javascript
复制
__RequestVerificationToken:"P5g2D8vRyE3aBn7qQKfVVVAsQc853s-naENvpUAPZLipuw0pa_ffBf9cINzFgIRPwsf7Ykjt46ttJy5ox5r3mzpqvmgNYdnKc1125jphQV0NnM5nGFtcXXqoY3RpusTH_WcHPzH4S4l1PmB8Uu7ubZBftqFdxCLC5n-xT0fHcAY1"

所以我们可以这样使用它

代码语言:javascript
复制
$(function () {
    $("#submit-list").click(function () {
        $.ajax({
            url: '@Url.Action("SortDataSourceLibraries")',
            data: { items: $(".sortable").sortable('toArray'), @Html.AntiForgeryTokenForAjaxPost() },
            type: 'post',
            traditional: true
        });
    });
});

而且它似乎起作用了!

票数 64
EN

Stack Overflow用户

发布于 2016-02-22 22:31:46

这太简单了!当您在html代码中使用@Html.AntiForgeryToken()时,这意味着服务器已经对此页面进行了签名,并且从此特定页面发送到服务器的每个请求都有一个标记,防止黑客发送虚假请求。因此,要让此页面通过服务器的身份验证,您应该经历两个步骤:

1.发送一个名为__RequestVerificationToken的参数,并使用以下代码获取其值:

代码语言:javascript
复制
<script type="text/javascript">
    function gettoken() {
        var token = '@Html.AntiForgeryToken()';
        token = $(token).val();
        return token;
   }
</script>

例如,以ajax调用为例

代码语言:javascript
复制
$.ajax({
    type: "POST",
    url: "/Account/Login",
    data: {
        __RequestVerificationToken: gettoken(),
        uname: uname,
        pass: pass
    },
    dataType: 'json',
    contentType: 'application/x-www-form-urlencoded; charset=utf-8',
    success: successFu,
});

第2步只需通过[ValidateAntiForgeryToken]修饰您的操作方法

票数 56
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14473597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档