当前位置: 首页 > 面试题库 >

在ASP.NET MVC中的Ajax中包含antiforgerytoken

漆雕宏浚
2023-03-14
问题内容

我在使用Ajax的AntiForgeryToken时遇到麻烦。我正在使用ASP.NET
MVC3。我在jQueryAjax调用和Html.AntiForgeryToken()中尝试了该解决方案。使用该解决方案,令牌现在可以通过:

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是在表单内部生成的,但是我没有使用Submit动作来提交它。相反,我只是使用jquery获取令牌的值,然后尝试用ajax发布该值。

这是包含令牌的表单,位于顶部母版页上:

<form id="__AjaxAntiForgeryForm" action="#" method="post">
    @Html.AntiForgeryToken()
</form>

问题答案:

您错误地指定contentTypeapplication/json

这是一个可能如何工作的示例

控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

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

视图:

@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>


 类似资料:
  • antiforgerytoken是在表单内生成的,但我没有使用提交操作来提交它。相反,我只是使用jquery获取令牌的值,然后尝试用ajax发布该值。 下面是包含令牌的表单,位于顶部母版页:

  • 问题内容: 我有以下代码: 我想在不使用JavaScript的情况下将验证令牌添加到链接中,这似乎是多余的依赖项,因为我已经在服务器中拥有该值。有适当的方法吗? 问题答案: 从MSDN文档(我的重点) HtmlHelper.AntiForgeryToken方法 生成一个隐藏的表单字段(防伪令牌),该表单字段在提交 表单 时经过验证。 您需要一个form元素来生成防伪令牌。

  • 我在时区面临一个问题。现在我正在从客户端保存时区,并将所有日期时间存储在UTC中。它工作正常,但当我试图将UTC的日期时间转换为CST、EST、EDT等时区后,它会显示错误的数据。 问题-假设我在美国东部夏令时晚上10点做了任何任务,并且它将在凌晨2点(按照UTC)保存在DB中,但当我尝试获取一天的数据并通过当前UTC日期时。 我的问题是,如果我试图获取一天的数据,比如从美国东部时间午夜11点到当

  • 问题内容: 我在Internet Explorer中的页面出现问题。我有一个Ajax调用,在其他浏览器中,当我单击该链接时,该调用会传递到控制器中并正确加载数据。但是在IE中,一次加载后,它消失了,而我却没有通过控制器就获得了相同的旧结果。 问题答案: 尝试: 放置在控制器类中的此属性禁用缓存。由于不需要在应用程序中缓存,因此将其放置在BaseController类中: 这是有关OutputCac

  • 我有一个结构如下的maven项目: 我希望maven jar插件在构建jar文件时打包到数据库文件夹中。我尝试过包含这里概述的内容:https://maven.apache.org/plugins/maven-jar-plugin/examples/include-exclude.html,但它找不到目录“../database”(或../../database或../../../database

  • 问题内容: 我正在为JEE5 Web服务编写单元测试。Web服务的行为取决于文件中设置的属性。因此,我想将我分成一个恒定的部分和一个在两次测试之间更改的部分。 为了查看是否确实可行,我尝试查看是否可以拆分该属性。根据一些说明,我发现了以下几点: web.xml fragment.xml 但是,我在文件上收到验证错误: 必须为元素类型“ web-app”声明属性“ version”。[7] 必须为元