0

语境

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

问题

我是否遗漏了什么,并且在某处有一个明确的属性/语句指示 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()
    {

    }
}
4

1 回答 1

1

以前在 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 攻击。如果您想违反约定,您可以在ConfigureServicesStartup 类的部分约定助手中找到选择退出的选项。

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages()
            .AddRazorPagesOptions(options =>
            {
                options.Conventions
                       .ConfigureFilter(new IgnoreAntiforgeryTokenAttribute());
            });
}

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

更新 - 对评论的回应

如果您阅读 a 代码,您可能会注意到没有 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>

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

<!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>
于 2021-10-16T06:07:37.507 回答