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授权系统。 敬请期待。
关注我的微信公众号
在公众号里留言交流
投稿邮箱:1052839972@qq.com
庭院深深深几许?杨柳堆烟,帘幕无重数。
玉勒雕鞍游冶处,楼高不见章台路。
雨横风狂三月暮。门掩黄昏,无计留春住。
泪眼问花花不语,乱红飞过秋千去。
如果感觉对您有帮助
欢迎向作者提供捐赠
这将是创作的最大动力