ASP.NET Web Stack运行时使用同步器令牌模式的变体来抵御XSRF攻击。同步器令牌模式的一般形式是,除了身份验证令牌):一个令牌作为Cookie,另一个作为表单值,两个反XSRF令牌提交到服务器。服务器在两个令牌通过比较检查时才允许请求继续。
如果使用RazorPage的视图默认是打开Anti-Forgery反XSRF验证的。使用MVC的话需要手动打开Anti-Forgery反XSRF验证。
在MVC视图或Razor页面调用@Html.AntiForgeryToken方法。
<form method="post">
@Html.AntiForgeryToken()
<input type="hidden" name="name" />
<input type="submit" value="submit" />
</form>
或者使用TagHelper标签
加入@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers后,默认打开验证,如果要关闭可以在标签上设置asp-antiforgery="false"
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
<form method="post" asp-antiforgery="true">
<input type="hidden" name="name" />
<input type="submit" value="submit" />
</form>
它们都会在生成的Html里输出一个隐藏的input
<input name="__RequestVerificationToken" type="hidden" value="CfDJ8D2AldnKCKtPu-yHYNyGFgLsK_rsu1jw-Oec7ad8nTOZGciIwSsGqc1_OLIxalzQDTOs3Howk-w1hq9JJx0SpU5Q_qjAWNjIbB1F52PnyDgSTaxQVWWj7_tP6doLk3ITWctN7Kg6Vz-yiXDW_Q2Tn4U" /></form>
在控制器上使用ValidateAntiForgeryToken属性
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Index(object obj)
{
}
或者使用ValidateRequestAsync方法验证令牌。
try
{
await _antiforgery.ValidateRequestAsync(HttpContext);
}
catch (Exception ex) {
// HttpAntiForgeryException
}
如果验证成功,则允许请求继续。 如果验证失败,框架将引发 HttpAntiForgeryException。
The required antiforgery request token was not provided in either form field \"__RequestVerificationToken\" or header value \"RequestVerificationToken\".