使用ASP.NET Core 默认默认提供的 应变策略 来全局启用身份验证

2021-04-26  乐帮网

c# netcore

默认情况下,您可以在 ASP.NET 核心 3.0+ 中使用应变策略,来验证用户的身份。从概念上讲,只有当控制器或Razor Page上没有指定其他属性(如 [AllowAnonymous] 或 [PolicyName="PolicyName")]时,它默认情况下自动将 [Authorize] 属性添加到每个控制器和Razor Page。 请参阅下面的行 9-11。

public class Startup
{
    // Other Startup code omitted 
    
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddAuthorization(options =>
        {
            options.FallbackPolicy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .Build();

            // Register other policies here
        });
        
        // Other service registrations omitted
    }
}

https://gist.github.com/scottsauber/06950b52ca45ab0b937dc59cad19e9de#file-startup-cs-L9-L11

简介 [Authorize] 和 [AllowAnonymous]  属性的使用

在 ASP.NET Core(甚至之前在 ASP.NET 中),我们可以将 [Authorize 属性添加到资源(如控制器或Razor Page),以便告诉 ASP.NET Core不允许用户访问该资源,除非它们经过身份验证。

[Authorize]
public class IndexModel : PageModel
{
    public void OnGet()
    {
        // do something
    }
}

[Authorize] 属性还可以采取策略名参数,告诉其执行什么授权策略。 下面的政策说,只有管理员可以访问此页面。

[Authorize(PolicyName="Admin")]
public class IndexModel : PageModel
{
    public void OnGet()
    {
        // do something
    }
}

您可以按照文章了解更多如何在 ASP.NET 核心中设置策略,以及如何执行您自己的自定义规则(例如定义管理员的内容)。

默认情况下,如果您不添加[Authorize]属性,则资源将无法得到保护,并且将可供未经授权的用户访问。 通过明确添加[AllowAnonymous]属性,也可以向未经授权的用户访问资源。

警告:添加 [AllowAnonymous] 属性可绕过所有授权,并短路退出授权管道,即使有其它授权设置。

划重点–必须记住在任何地方添加[Authorize]属性


当您在 ASP.NET Cor中创建新的控制器或Razor页面时,默认情况下,任何人都可以访问该资源,因为没有 [授权] 属性。 如果您正在创建一个网站,其中大多数网站都受到某种身份验证的保护,这是一个问题。 很容易忘记添加一个 [Authorize] 属性, 它可以打开您的应用程序寻找安全漏洞, 并留给你一个潜在的...让我们称之为"恢复更新事件" 

什么是应变政策?

默认情况下,ASP.NET 核心 3.0 打开端点路由,这是一种让路由信息与 MVC 紧密耦合,使路由更全局化到整个堆栈(如中间件)的方法。 3.0 版本引入了带有端点路由的应变政策概念。
应变政策意味着,如果控制器或Razor 页面上没有指定其他策略或属性,则授权中间件将使用应变政策。 因此,如果您不添加任何其他属性(如[AllowAnonymous]或[Authorize(PolicyName="PolicyName")],则 ASP.NET 核心将使用应变政策。
解决方案–默认情况下使用应变政策要求身份验证
因此,通过使用应变政策,我们可以指定用户必须始终对应用中的每个控制器或Razor页面进行身份验证。 您可以通过服务中的授权选项在配置服务下将此连接起来。添加授权。  请参阅下面的行 9-11:

public class Startup
{
    // Other Startup code omitted 
    
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddAuthorization(options =>
        {
            options.FallbackPolicy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .Build();

            // Register other policies here
        });
        
        // Other service registrations omitted
    }
}

从概念上讲,只有当控制器或Razor 页面上没有指定其他属性(如 [AllowAnonymous] 或 [Authorize(PolicyName="PolicyName")]时,您才能将默认情况下的 [Authorize] 属性添加到每个控制器和剃刀页。
当然,您也可以更进一步,通过让您的应变政策成为需要某些特定的政策,而不仅仅是经过身份验证。 选择权在你!

我们这样做能得到什么?

更安全的默认值。 开发人员不必记住向每个控制器或Razor 页面添加[Authorize]属性。
更少的样板。 每个需要身份验证的控制器和Razor 页面都少了一行样板代码需要担心。
你不会丢失任何灵活性

如果控制器或Razor页面应该向未经授权的用户(如登录页面或忘记密码页面)公开,则您仍然可以添加 [AllowAnonymous] 属性,并绕过应变政策。

如果控制器或Razor页需要特定策略,您仍然可以添加带有自定义策略名称的授权属性。 这将优先于应变政策,如[Authorize(PolicyName="PolicyName")].

默认策略与应变政策

当看到除了应变政策(或者至少我这样做了)之外还有"默认策略"时,您可能会感到困惑。 在我的脑海里,我想"哦,应变政策有点像运行的默认政策。。。但是等等。。。什么是默认政策呢?
默认策略是在需要授权时进行评估的策略,但没有指定明确的策略。 换句话说,当您添加"Authorize"属性时,会评估该策略,而没有任何策略名。 开箱即用,默认策略设置为要求身份验证的用户。
另一方面,应变政策是在未指定其他策略(例如当控制器或Razor页上不存在[AllowAnonymous]或[Authorize]属性时)进行评估的策略)

对于 ASP.NET Core 2.x的解决方案

ASP.NET Core 2.x 中此问题的一个常见解决方案是在 MVC 中添加一个全局筛选器,例如下面的行 10-13:

public class Startup
{
    // Other Startup code omitted     
    public void ConfigureServices(IServiceCollection services)
    {
        // OLD WAY FROM ASP.NET CORE PRIOR TO 3.0!!!!!!!!!
        services.AddMvc(options =>
        {
            var policy = new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .Build();
            options.Filters.Add(new AuthorizeFilter(policy));
        });
        
        // Other service registrations omitted
    }
}

总结
在我看来,使用应变政策的新方法更有意义。它将所有内容保留在授权配置中,并且不会将授权逻辑嵌入到 MVC 过滤器中。 唯一有点不方便的是默认策略和应变政策之间的命名, 但一旦你理解了它们的细微差别, 命名是有道理的。
在未来的帖子中,我将解读其他提示和技巧,以利用 ASP.NET Core授权系统。 敬请期待。

原文地址:https://scottsauber.com/2020/01/20/globally-require-authenticated-users-by-default-using-fallback-policies-in-asp-net-core/

公众号二维码

关注我的微信公众号
在公众号里留言交流
投稿邮箱:1052839972@qq.com

庭院深深深几许?杨柳堆烟,帘幕无重数。
玉勒雕鞍游冶处,楼高不见章台路。
雨横风狂三月暮。门掩黄昏,无计留春住。
泪眼问花花不语,乱红飞过秋千去。

欧阳修

付款二维码

如果感觉对您有帮助
欢迎向作者提供捐赠
这将是创作的最大动力