为什么按类型添加AutoValidateAntiForgeryTokenAttribute不起作用?

Bli*_*sco 5 c# asp.net-core

在ASP.NET Core中,您可以通过在Startup.cs(docs)中包含此行来验证所有非GET请求:

services.AddMvc(options => options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute()));
Run Code Online (Sandbox Code Playgroud)

但是,如果按类型添加过滤器(使用typeof或使用泛型Add<T>方法),则验证似乎不起作用:

// Doesn't work
services.AddMvc(options => options.Filters.Add(typeof(AutoValidateAntiforgeryTokenAttribute));
// Doesn't work either
services.AddMvc(options => options.Filters.Add<AutoValidateAntiforgeryTokenAttribute>());
Run Code Online (Sandbox Code Playgroud)

请参阅https://github.com/davidgruar/GlobalFilterDemo以获得最小的repro.

这里发生了什么?

Tha*_*rai 2

您需要向 DI 容器注册类型。我刚刚尝试过并且有效。

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc(options =>
    {
        // This works
        //options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());

        // These variants don't work
        //options.Filters.Add<AutoValidateAntiforgeryTokenAttribute>();
        options.Filters.Add(typeof(AutoValidateAntiforgeryTokenAttribute));
    });

    services.AddScoped<AutoValidateAntiforgeryTokenAttribute>();
}
Run Code Online (Sandbox Code Playgroud)