ZetCode

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。

Program.cs
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 功能,包括反伪造令牌支持。

Controllers/AccountController.cs
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 的保护。

Views/Account/ChangePassword.cshtml
@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 保护的完整实现。令牌可确保请求来自您的表单。

来源

Microsoft 反伪造文档

在本文中,我们探讨了 ASP.NET 8 中的 ValidateAntiForgeryToken 属性。此关键安全功能有助于保护您的应用程序免受 CSRF 攻击。

作者

我叫 Jan Bodnar,是一位热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教授编程方面拥有超过十年的经验。

列出所有 ASP.NET 教程