一、在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>