.Net Core 防止跨站点请求伪造

一、在From 表单中生成 antiforgery 令牌  

  1. ASP.NET Core MVC 和 Razor 页模板中的窗体的所有生成 antiforgery 令牌,唯一且不可预测。服务器先发送到客户端的当前用户的标识相关联的令牌。客户端返回将令牌发送到服务器进行验证。如果服务器收到与经过身份验证的用户的标识不匹配的令牌,将拒绝请求。

<body>
    <form action="/Antiforgery/Post" method="post">

        @Html.AntiForgeryToken()

        <input type="text" name="id" />

        <button type="submit">提交</button>
    </form>

    @{
        using (Html.BeginForm("Post", "Antiforgery", FormMethod.Post))
        {
            <input type="text" name="id" />

            <button type="submit">提交</button>
        }

    }
</body>

  2. 用 [ValidateAntiForgeryToken] 属性修饰需要验证的放法。ValidateAntiForgeryToken 属性需要对操作方法请求修饰,包括 HTTP GET 请求令牌。

public class AntiforgeryController:Controller
    {

        public IActionResult Index()
        {
            return View();
        }

        [ValidateAntiForgeryToken]
        public JsonResult Post(string id)
        {
            return Json("success");
        }
    }

  3. AutoValidateAntiforgeryToken 可以修饰控制器类,其作用于所有Post请求。

    [AutoValidateAntiforgeryToken]
    public class AntiforgeryController:Controller
    {

        public IActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public JsonResult Post(string id)
        {
            return Json("success");
        }

        [HttpPost]
        public JsonResult PostTest()
        {
            return Json("");
        }
    }

二、Ajax的方式使用 antiforgery 令牌  

  1. 在配置自定义防伪功能,指定HeaderName

public void ConfigureServices(IServiceCollection services)
{
    services.AddAntiforgery(op =>
    {
        op.FormFieldName = "AntiforgeryField";
        op.HeaderName = "VerificationToken";//手动高亮
    });
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

  2. 在页面上生成antiforgery令牌

@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Antiforgery
@{
    Layout = null;
}
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <input type="hidden" id="token" value="@Antiforgery.GetAndStoreTokens(Context).RequestToken"/>
</body>
</html>

  3. 把令牌存放到headers中调用ajax 

@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Antiforgery
@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <input type="hidden" id="token" value="@Antiforgery.GetAndStoreTokens(Context).RequestToken"/>
    
    <script src="~/lib/jquery/dist/jquery.js"></script>
    <script>
        $.ajax({
            url: "/Antiforgery/Index",
            type: "post",
            data: { id: "123" },
            headers: { VerificationToken: $("#token").val() },
            success: function (r) {
                console.log(r);
            },
            error: function (e) {
                console.log(e);
            }
        });
    </script>
</body>
</html>
原文地址:https://www.cnblogs.com/haosit/p/10899296.html