ASP.NET ValidateAntiForgeryToken
最后修改于 2025 年 4 月 3 日
在本文中,我们将探讨 ASP.NET 8 中的 ValidateAntiForgeryToken 属性。此安全功能可防止跨站请求伪造 (CSRF) 攻击。
ASP.NET 通过反伪造令牌提供对 CSRF 攻击的内置保护。ValidateAntiForgeryToken 属性会验证这些令牌。
基本定义
ASP.NET 中的 ValidateAntiForgeryToken 属性是一项安全功能,用于验证 HTTP 请求中的反伪造令牌。这些令牌可防止 CSRF 攻击。
CSRF 攻击会诱使用户在已验证身份的情况下提交恶意请求。反伪造令牌可确保请求源自您的应用程序的 UI。
当应用于操作方法时,ValidateAntiForgeryToken 要求每个 POST 请求都带有有效的令牌。令牌是通过使用帮助程序在表单中生成的。
令牌包含两部分:Cookie 令牌和表单令牌。两者都必须匹配,请求才被视为有效。这可以防止外部网站进行请求。
ASP.NET ValidateAntiForgeryToken 示例
以下示例演示了在表单提交场景中使用 ValidateAntiForgeryToken。
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllersWithViews(); var app = builder.Build(); app.UseStaticFiles(); app.MapControllers(); app.MapDefaultControllerRoute(); app.Run();
这会设置一个基本的 ASP.NET MVC 应用程序。AddControllersWithViews
方法启用了 MVC 功能,包括反伪造令牌支持。
using Microsoft.AspNetCore.Mvc; public class AccountController : Controller { [HttpGet] public IActionResult ChangePassword() { return View(); } [HttpPost] [ValidateAntiForgeryToken] public IActionResult ChangePassword(ChangePasswordModel model) { if (!ModelState.IsValid) { return View(model); } // Process password change return RedirectToAction("Success"); } } public class ChangePasswordModel { public string CurrentPassword { get; set; } public string NewPassword { get; set; } public string ConfirmPassword { get; set; } }
该控制器有两个操作:一个用于显示表单(GET),一个用于处理表单(POST)。POST 操作受到 ValidateAntiForgeryToken 的保护。
@model ChangePasswordModel <h2>Change Password</h2> <form method="post"> @Html.AntiForgeryToken() <div class="form-group"> <label asp-for="CurrentPassword"></label> <input asp-for="CurrentPassword" class="form-control" /> <span asp-validation-for="CurrentPassword"></span> </div> <div class="form-group"> <label asp-for="NewPassword"></label> <input asp-for="NewPassword" class="form-control" /> <span asp-validation-for="NewPassword"></span> </div> <div class="form-group"> <label asp-for="ConfirmPassword"></label> <input asp-for="ConfirmPassword" class="form-control" /> <span asp-validation-for="ConfirmPassword"></span> </div> <button type="submit" class="btn btn-primary">Change Password</button> </form>
视图包含一个带有 Html.AntiForgeryToken()
帮助程序的表单。这会生成一个带有反伪造令牌的隐藏表单字段。
提交表单时,Cookie 令牌和表单令牌都会被验证。如果其中任何一个丢失或不匹配,请求将被拒绝,并返回 400 错误。
该示例展示了对敏感操作(密码更改)进行 CSRF 保护的完整实现。令牌可确保请求来自您的表单。
来源
在本文中,我们探讨了 ASP.NET 8 中的 ValidateAntiForgeryToken 属性。此关键安全功能有助于保护您的应用程序免受 CSRF 攻击。