即使没有明确的 [AutoValidateAntiforgeryToken],是不是也会自动添加防伪令牌?

Posted

技术标签:

【中文标题】即使没有明确的 [AutoValidateAntiforgeryToken],是不是也会自动添加防伪令牌?【英文标题】:Is anti forgery token added automatically, even without explicit [AutoValidateAntiforgeryToken]?即使没有明确的 [AutoValidateAntiforgeryToken],是否也会自动添加防伪令牌? 【发布时间】:2021-12-04 03:09:21 【问题描述】:

上下文

我注意到,在 VS 2019 中从其开箱即用的模板创建新的 ASP.NET Core Razor 页面应用程序后,即使是具有 最纯粹最纯粹 html 表单strong> 模型类使用<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()
    

    

【问题讨论】:

【参考方案1】:

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

[ValidateAntiForgeryToken]
public ActionResult Save(Product product)

  db.Product.Add(product);
  Return View();

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

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

public void ConfigureServices(IServiceCollection services)

    services.AddRazorPages()
            .AddRazorPagesOptions(options =>
            
                options.Conventions
                       .ConfigureFilter(new IgnoreAntiforgeryTokenAttribute());
            );

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

更新 - 对评论的回应

如果您阅读 a 代码,您可能会注意到没有 taghelper。 – g.pickardou

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

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

我们可以验证您的 &lt;form /&gt; 元素(如 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>

【讨论】:

如果你阅读了a代码,你可能会注意到没有taghelper。 你错了。我将通过重现来更新我的答案。 你是对的,谢谢你的启发 np。我完全理解你来自哪里。有很多新功能,并且对开发人员隐藏了这些功能。不确定这是否一定是最好的。

以上是关于即使没有明确的 [AutoValidateAntiforgeryToken],是不是也会自动添加防伪令牌?的主要内容,如果未能解决你的问题,请参考以下文章

在 QFormLayout 中动态创建的 QWidget 没有框架,即使明确要求这样做

即使没有明确使用事务,ACID投诉SQL数据库仍然是“ACID”吗?

linq2db 异常:“未提供配置字符串”。我没有 web/app.config,但即使我明确给出字符串,同样的异常

即使在使用 PySpark 读取 .ORC 文件时明确指定,也缺少标题

Swift:命令中心不起作用,即使我明确设置按钮启用?

即使明确设置 PreparedStatement 也不会超时