MVC Core 如何强制/设置所有操作的全局授权?

Posted

技术标签:

【中文标题】MVC Core 如何强制/设置所有操作的全局授权?【英文标题】:MVC Core How to force / set global authorization for all actions? 【发布时间】:2016-07-24 15:12:15 【问题描述】:

如何为 MVC Core 中的所有操作强制/设置全局授权?

我知道如何注册全局过滤器 - 例如我有:

Setup.cs

services.AddMvc(options =>

    options.Filters.Add(new RequireHttpsAttribute());
);

这很好用,但我不能为 Authorize 添加相同的内容:

options.Filters.Add(new AuthorizeAttribute());

我有错误:

Cannot convert from 'Microsoft.AspNet.Authorization.AuthorizeAttribute()' to 'System.Type'

(方法.Add()需要IFilterMetadata类型)

我知道 - 从类似的问题 - 这适用于 MVC4-5...所以必须在 MVC Core 上进行一些更改...

有人知道吗?

【问题讨论】:

【参考方案1】:

将以下内容添加到 StartUp.cs 中的 ConfigureServices。这是用于令牌验证并强制所有调用使用令牌进行验证。

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer(options =>
            
                options.TokenValidationParameters = new TokenValidationParameters
                
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey = new SymmetricSecurityKey(key),
                    ValidateIssuer = false,
                    ValidateAudience = false
                ;
            );

services.AddMvc(options =>
        
            var policy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .Build();
            options.Filters.Add(new AuthorizeFilter(policy));
        )`

将此添加到 StartUp.cs 中的 Configure 方法。

app.UseAuthentication();

注意:在不需要的地方使用 [AllowAnonymous]

【讨论】:

【参考方案2】:
services.AddMvc(config =>

    var policy = new AuthorizationPolicyBuilder()
                     .RequireAuthenticatedUser()
                     .Build();
    config.Filters.Add(new AuthorizeFilter(policy));
);

【讨论】:

让我问一下——在你看来——这是一种好的做法吗?我必须做 WebApp 供内部使用,并且我需要确保公众无法访问它。 也许还有一个问题 - 该(全局)解决方案是否会对性能产生任何负面影响(与对每个类使用 AuthorizeAttribute 相比)? 那么,这是一种好的做法吗?当然,尽管这取决于您的身份验证方案本身。对于内部使用的 API,如果可能的话,我会将它们保留在内部,物理上。请注意,这将接受任何身份,无论是来自表单还是 JWT 令牌。因此,在 WebApi 场景中,您通常只想接受由您的 AD 基础设施发布的 JWT。性能方面应该非常相似。 再次感谢您。你是老板;)但是你的回答提出了更多的问题——我希望你不介意......你说'请注意,这将接受任何身份,无论是来自表格还是 JWT 令牌'......你的意思是'任何,任何'或只有'任何有效'我的身份数据库?据我了解 - AuthoriseAttribute(没有指定策略)允许任何经过身份验证的用户访问并阻止其他所有人访问?顺便提一句。它用于 Web 应用程序 - 就目前而言,我不打算公开任何 WebApi。 所以在 ASP.NET Core 中有多种方法可以获取身份。有内置的身份,有 Azure Active Directory,Facebook。 Twitter,有 JSON Web Tokens,哎呀,我什至写了基本的身份验证。这些都可以在一个应用程序中运行。因此,当我说“任何身份”时,我指的是由任何身份中间件构建的任何身份。但是,用户仍然必须经过身份验证。如果您使用的只是 ASP.NET Identity 的东西,您不必担心,但如果您开始使用更多,您可能还想通过身份验证类型来限制...

以上是关于MVC Core 如何强制/设置所有操作的全局授权?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC 角色授权

Asp Core MVC 2.1授权基于每个用户的策略?

如何在 .Net Core MVC 中实现 IAuthorization Filter 时获取连接字符串?

EF Core 中的 ASP.NET Core 5 MVC 和 Identity - 基于资源的授权

.Net Core 2.1 WepAPI 中使用 JWT 的身份验证和授权

ASP.NET Core MVC 之控制器(Controller)