即使没有显式 [AutoValidateAntiforgeryToken],是否会自动添加防伪标记?

Is anti forgery token added automatically, even without explicit [AutoValidateAntiforgeryToken]?

上下文

我注意到,在 VS 2019 中从开箱即用的模板创建新的 ASP.NET Core Razor 页面应用程序后,即使是 purest html 形式与 最纯粹的 模型 class 渲染输出与 <input name="__RequestVerificationToken" type="hidden" value="...">

问题

我是不是遗漏了什么,某处有明确的 attribute/statement 指示 ASP.NET Core 添加防伪造功能,或者现在这是默认设置? (这使得使用 [AutoValidateAntiforgeryToken] 过时)

...或...

只是 <input name="__RequestVerificationToken" type="hidden" value="..."> 总是 无条件地 呈现,并且 [AutoValidateAntiforgeryToken] 我可以针对它打开服务器端验证吗?这种情况下如何冒烟测试验证是否有效?

示例代码

@page
@model TestFormModel
@{
    ViewData["Title"] = "Home page";
}

<div class="text-center">
    <form method="post">
        <input type="text" name="myinput"/>
        <input type="submit" value="Submit" />
    </form>
</div>

//[AutoValidateAntiforgeryToken]
public class TestFormModel : PageModel
{
    private readonly ILogger<TestFormModel> _logger;

    public TestFormModel(ILogger<TestFormModel> logger)
    {
        _logger = logger;
    }

    public void OnGet()
    {

    }

    public void OnPost()
    {

    }
}

以前在 ASP.NET 的 .NET Framework 版本中,您必须选择加入通常带有属性的防伪令牌。

[ValidateAntiForgeryToken]
public ActionResult Save(Product product)
{
  db.Product.Add(product);
  Return View();
}

在 ASPNET Core 中,这会自动包含在 Form Tag Helper 中。因此,只要您的 CSHTML 包含 FORM 元素,ASPNET Core 运行时就会包含隐藏字段。

默认包含这个的基础是“约定优于配置”的口头禅。按照惯例,80% 以上的开发人员会选择保护他们的应用程序免受 CSRF 攻击。如果你想违反惯例,你可以在 Startup class.

ConfigureServices 部分的惯例助手中找到选择退出的选项。
public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages()
            .AddRazorPagesOptions(options =>
            {
                options.Conventions
                       .ConfigureFilter(new IgnoreAntiforgeryTokenAttribute());
            });
}

This blog post 进一步详细介绍了 Razor 页面、选项和使用场景。

更新 - 对评论的回应

If you read the a code, you may notice that there is no taghelper. – g.pickardou

确实有一个标签助手。在新的 Razor Pages 项目模板中,您可以在此处的 _ViewImports.cshtml 文件中找到标签助手:

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

我们可以验证您的 <form /> 元素,如 OP 中所写,正在调用一个 ASP.NET 标签助手,如下所示:

    <form method="post">
        <input type="text" name="myinput"/>
        <input type="submit" value="Submit" />
    </form>

如果我们在此检查页面源代码,您将看到结果

<form method="post">
    <input type="text" name="myinput" />
    <input type="submit" value="Submit" />
<input name="__RequestVerificationToken" type="hidden" value="{{token}}" />
</form>

现在,如果我们使用 opt out of individual tag helpers

的语法
<!form method="post">
    <input type="text" name="myinput" />
    <input type="submit" value="Submit" />
</!form>

再次检查页面源代码,我们可以清楚地看到我们已明确选择退出此标签助手。

<form method="post">
    <input type="text" name="myinput" />
    <input type="submit" value="Submit" />
</form>