即使没有显式的 [AutoValidateAntiforgeryToken],防伪令牌也会自动添加吗?

g.p*_*dou 1 request-validation antiforgerytoken asp.net-core razor-pages

语境

我注意到,在 VS 2019 中从开箱即用的模板创建新的 ASP.NET Core Razor 页面应用程序后,即使是具有最纯粹模型类的最纯粹的html 表单也会使用<input name="__RequestVerificationToken" type="hidden" value="...">

问题

我是否遗漏了某些内容,并且在某个地方有一个显式属性/语句指示 ASP.NET Core 添加防伪功能,或者现在这是默认设置?(这使得 using[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()
    {

    }
}
Run Code Online (Sandbox Code Playgroud)

Ada*_*ent 5

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

\n
[ValidateAntiForgeryToken]\npublic ActionResult Save(Product product)\n{\n  db.Product.Add(product);\n  Return View();\n}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

默认情况下包含此内容的基础是“约定优于配置”的口号。按照惯例,80% 以上的开发人员会选择保护他们的应用程序免受 CSRF 攻击。如果您想违反约定,可以在ConfigureServicesStartup 类部分的约定帮助器中找到选择退出的选项。

\n
public void ConfigureServices(IServiceCollection services)\n{\n    services.AddRazorPages()\n            .AddRazorPagesOptions(options =>\n            {\n                options.Conventions\n                       .ConfigureFilter(new IgnoreAntiforgeryTokenAttribute());\n            });\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这篇博文进一步详细介绍了 Razor 页面、选项和使用场景。

\n

更新 - 对评论的回应

\n
\n

如果您阅读代码,您可能会注意到没有 taghelper。\xe2\x80\x93\ng.pickardou

\n
\n

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

\n
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers\n
Run Code Online (Sandbox Code Playgroud)\n

我们可以验证您的<form />元素(如 OP 中所写)正在调用 ASP.NET 标记帮助程序,如下所示:

\n
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
    <form method="post">\n        <input type="text" name="myinput"/>\n        <input type="submit" value="Submit" />\n    </form>\n
Run Code Online (Sandbox Code Playgroud)\n

现在,如果我们使用语法来选择退出单个标签助手

\n
<form method="post">\n    <input type="text" name="myinput" />\n    <input type="submit" value="Submit" />\n<input name="__RequestVerificationToken" type="hidden" value="{{token}}" />\n</form>\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
<!form method="post">\n    <input type="text" name="myinput" />\n    <input type="submit" value="Submit" />\n</!form>\n
Run Code Online (Sandbox Code Playgroud)\n