
ASP.net Core 中的防伪令牌(Anti-Forgery Token)通过验证请求是否来自受信任的客户端来防止跨站请求伪造(CSRF)攻击。CSRF 攻击利用用户在浏览器中已认证的身份,诱导用户在不知情的情况下提交恶意请求。防伪令牌机制确保只有来自应用自身页面的表单提交或敏感操作请求才能被服务器接受。
防伪令牌的工作原理
防伪令牌依赖于一对令牌:一个存储在用户的 cookie 中,另一个嵌入在表单或请求中。服务器在处理请求时会比对这两个值,只有匹配才允许继续执行。
- Cookie 令牌:由服务器生成并自动写入用户的浏览器 cookie,不暴露给前端 javaScript(标记为 HttpOnly 可选)。
- 隐藏输入字段:在 Razor 页面或视图中使用
@html.AntiForgeryToken()或<input asp-antiforgery="true">时,框架会在表单中插入一个名为__RequestVerificationToken的隐藏字段。 - 请求验证:当表单提交时,ASP.NET Core 的防伪服务会读取 cookie 中的令牌和请求体中的令牌,进行比对。如果不一致或缺失,请求会被拒绝,返回 400 错误。
启用与使用方式
在 ASP.NET Core 中,防伪保护默认集成在 mvc 和 Razor Pages 中,但需要显式启用和使用。
- 全局启用:在
Program.cs中调用AddAntiforgery()配置选项,例如设置 cookie 名称、请求字段名等。 - 在视图中使用:Razor 视图中加入
@Html.AntiForgeryToken(),或使用标签助手自动生成。 - API 场景处理:对于 ajax 请求,需从 cookie 获取令牌,并在请求头(如
RequestVerificationToken)中携带。后端使用[ValidateAntiForgeryToken]或[AutoValidateAntiforgeryToken]标记控制器或动作。
为何能有效防御 CSRF
攻击者无法访问目标站点的 cookie(因同源策略限制),也就无法获取当前用户的防伪令牌值。即使用户登录了目标网站,恶意站点也无法构造出包含正确令牌的请求。
- 即使攻击者诱导用户点击链接或提交表单,缺少有效的防伪令牌会导致请求被服务器拒绝。
- 由于 cookie 和请求令牌是绑定生成的,且通常带有用户标识和随机熵,难以猜测或重放。
基本上就这些。只要正确配置并确保每个敏感操作都经过防伪验证,就能有效阻断大多数 CSRF 攻击路径。不复杂但容易忽略细节,比如 API 请求忘记加令牌头,或者 SPA 应用未妥善提取和发送令牌。


