小编iCo*_*ode的帖子

AJAX POST到Web API控制器和CSRF

我基本上需要在我的Web API控制器中防止跨站点请求伪造,这是MVC应用程序的一部分.我对任何想法持开放态度.此时,我有一个MVC视图,它使用ArcGIS for JavaScript API显示Esri地图.用户在地图上创建路线,并且可以通过AJAX POST保存其穿过的路线和各种功能.视图没有表单.这是因为我POST到服务器的所有数据都在内存中,而且在屏幕上(或在隐藏字段中)不可见.

所以,我在MVC视图中有以下内容来获取防伪令牌:

@functions{
public string GetTokenHeaderValue()
{
    string cookieToken, formToken;
    AntiForgery.GetTokens(null, out cookieToken, out formToken);
    return cookieToken + ":" + formToken;
}
}
Run Code Online (Sandbox Code Playgroud)

我在View中有这个隐藏的输入,但是意识到这很糟糕,因为它既有'form token',也有与AntiForgery.Validation一起使用的cookie令牌:

<input type="hidden" id="antiforgeryToken" value="@GetTokenHeaderValue()" />
Run Code Online (Sandbox Code Playgroud)

然后,在一个单独的JavaScript文件中(不在View中的脚本标记中),我正在对我的Web API Controller进行Http POST.这是我将令牌添加到请求标头的位置:

var headers = {};
headers['RequestVerificationToken'] = $("#antiforgeryToken").val();
// Ajax POST to Web API Controller
$.ajax({
    async: true,
    url: '/api/RouteData',
    type: 'POST',
    headers: headers,
    data: requestData,
    dataType: 'json',
    error: function (xhr, statusText, errorThrown) {
        console.log('Error saving route data! ' + errorThrown);
    }, …
Run Code Online (Sandbox Code Playgroud)

javascript ajax asp.net-mvc jquery asp.net-web-api

5
推荐指数
1
解决办法
1802
查看次数

标签 统计

ajax ×1

asp.net-mvc ×1

asp.net-web-api ×1

javascript ×1

jquery ×1