在服务器端使用 Ajax 和 Web API 阻止 Web 窗体中的 CSRF



我有一个网站,我需要避免CSRF攻击。我研究了很多时间,所有示例都在客户端使用这样的函数

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

在像这样的 ajax 调用之后:

$.ajax("api/values", {
    type: "post",
    contentType: "application/json",
    data: {  }, // JSON data goes here
    dataType: "json",
    headers: {
        'RequestVerificationToken': '@TokenHeaderValue()'
    }
});

显然,第一个代码是MVC剃刀调用,所以我不能在我的情况下使用它。有没有办法在不使用MVC的情况下使用javascript/jquery获得这个防伪令牌 ASP.NET?

我找到了一个简单的解决方案:

在 aspx 或 ascx 文件中,放置一个隐藏字段,如下所示:

<input type="hidden" id="hdnAntiForgeryTokens" runat="server" value=""/>

在 C# 端,创建如下所示的属性:

    protected string AntiForgeryTokens
    {
        get
        {
            string cookieToken, formToken;
            AntiForgery.GetTokens(null, out cookieToken, out formToken);
            return cookieToken + ":" + formToken;
        }
    }

并在Page_Load事件中为其赋值:

hdnAntiForgeryTokens.Value = AntiForgeryTokens;

之后,使用 jquery 读取值:

$.ajax({
        type: "POST",
        url: //your web api url,
        data: getJason(),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        headers: {
            'RequestVerificationToken': $('#hdnAntiForgeryTokens').val()
        },
        statusCode: {
            200: function _() {
                //success handling
            },
            500: function (){
                //error handling
            }
        }
    });

我希望它对遇到此问题的其他人有所帮助。

最新更新