0

在我的 SPA 网站中,我需要通过 ajax 将防伪令牌发送到服务器。我使用这篇文章的方法:

http://www.asp.net/web-api/overview/security/preventing-cross-site-request-forgery-%28csrf%29-attacks

所以在我的 layout.cshtml 我有本地功能:

<script>
    @functions{
    public string TokenHeaderValue()
    {
        string cookieToken, formToken;
        AntiForgery.GetTokens(null, out cookieToken, out formToken);
        return cookieToken + ":" + formToken;                
    }
}
</script>

我有一个名为 register.js 的单独 js 文件,我在 ajax 中调用这个函数:

   $.ajax({
                url: 'User/JsonRegister',
                type: "POST",
                data: d,
                headers: {
                    'RequestVerificationToken': '@TokenHeaderValue()'
                },
                success: function (result) {
                },
                error: function (result) {
                }
            });

问题是我从来没有调用过@TokenHeaderValue() 并且我一直收到这个错误:

The required anti-forgery form field "__RequestVerificationToken" is not present.

我该如何解决这个问题?

4

3 回答 3

0

问题是在单独的 js 文件中使用服务器端辅助函数。如果需要在单独的 js 文件中进行 ajax 调用,请将@TokenHeaderValue()value 设置为隐藏字段并读取 js 文件中隐藏字段的值。

于 2013-06-09T09:34:20.710 回答
0

我以这种方式将令牌添加到我的数据中:这解决了问题

 AddAntiForgeryToken = function (data) {
            data.__RequestVerificationToken = $('#__AjaxAntiForgeryForm input[name=__RequestVerificationToken]').val();
            return data;
        };
于 2013-06-09T12:08:56.003 回答
-1

以 JSON 格式传递数据

$.ajax({
     type:"POST",
     datatype:"JSON",
     data:{d:d}, // Remaining code is same

});

[HttpPost]在控制器中使用方法签名之前,因为它是一个Post请求。

于 2013-06-09T09:35:41.000 回答