如何在ASP.NET Core中添加全局的`AuthorizeFilter`或`AuthorizeAttribute`?

42

在 ASP.NET MVC 4 及以下版本中,我们只需在 Global.asax 中添加以下内容:

GlobalFilters.Filters.Add(new AuthorizeAttribute() { Roles = "Admin, SuperUser" });

你知道在ASP.NET Core MVC中怎么做吗?


你有查看文档吗? - tmg
@tmg 谢谢你提供这个,看起来在核心中无法像以前的 ASP.NET 版本那样将其作为“new AuthorizeAttribute()”注入到管道中,我现在正在寻找一种方法来迁移上述过滤器到核心中。 - xird
4个回答

70

根据文档

您可以通过将筛选器添加到Startup类中的ConfigureServices方法中的MvcOptions.Filters集合来全局注册筛选器(适用于所有控制器和操作):

您不能将AuthorizeAttribute添加到MvcOptions.Filters中。请创建一个AuthorizationPolicy并使用AuthorizeFilter

var policy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .RequireRole("Admin", "SuperUser")
        .Build();

services.AddMvc(options =>
{
    options.Filters.Add(new AuthorizeFilter(policy));
});

1
所以我从每个控制器/操作中删除了[Authorize]注释,并添加了您的代码片段。不幸的是,在我的端上它没有起作用。我得到了一个401:/ - binaryguy
“AuthorizationFilter” 似乎已经随着 “Microsoft.AspNetCore.Mvc.Authorization” NuGet 包的消失而消失了。有什么想法吗? - Fiddle Freak

20

你也可以使用以下代码。这是使用类型而不是实例。

services.AddMvc(options =>
{
    options.Filters.Add(typeof(AuthorizeFilter));
});

通过使用依赖注入,您可以解析策略对象。


1
你能详细说明一下你的贡献吗?比如,如何为 DI 注册一个策略? - Choco
这应该是真正的答案。 - Tanveer Badar

5
如果您正在使用ASP.NET Core 2.0的Razor页面,则可以按照以下方式添加全局过滤器:

Razor Page flavor

services.AddMvc()
.AddRazorPagesOptions(options =>
        {
            options.Conventions.AuthorizeFolder("/"); // Require users to be authenticated.
            options.Conventions.AuthorizeFolder("/", "YourPolicyName"); // Require a policy to be full filled globally.
        });

3

在@maxspan的回答基础上,我想补充一下,并且我觉得这个回答非常有帮助。

我需要强制要求我的API中必须出现令牌。这是我最终采取的措施。

  • 创建了一个授权策略,并将其作为依赖项注入到Startup.cs中。
AuthorizationPolicy policy = new AuthorizationPolicyBuilder(JwtBearerDefaults.AuthenticationScheme).RequireAuthenticatedUser().Build();
services.AddSingleton(policy);
  • 创建了一个名为BearerTokenAuthorizationFilter的过滤器,它继承自AuthorizeFilter并检索策略依赖项。
public class BearerTokenAuthorizationFilter : AuthorizeFilter
{
  private readonly AuthorizationPolicy _policy;

  public BearerTokenAuthorizationFilter(AuthorizationPolicy policy) : base(policy)
  {
      _policy = policy;
  }

  public override async Task OnAuthorizationAsync(AuthorizationFilterContext context)
  {
    //Use the policy here...
  }
}
  • 我在API的所有控制器上应用了这个过滤器。
services.AddControllers(options =>
{
    options.Filters.Add(typeof(BearerTokenAuthorizationFilter));
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接