在ASP.Net Core中设置默认全局authorization 授权访问
ASP.NET Core 拥有广泛的授权系统,您可以使用该系统创建复杂的授权策略。在这篇文章中,我查看了各种方法,您可以将这些策略应用到你常见的应用程序中。
我们将首先配置一个全局授权过滤器,看看为什么这不再是 ASP.NET Core 3.0+推荐的方法。然后,我们将使用端点路由以及使用Razor Page conventions 将不同的授权策略应用到应用的不同部分,然后查看替代方案。我们还将将默认政策与"后退政策“(一个自定义策略)进行比较,看看何时应用它们,以及如何更新它们。
在这篇文章时,我会假设你有一个标准的Razor Page应用程序,与启动.cs类似的东西。这一点的细节不是很重要,我只是假设你已经为您的应用程序配置了身份验证和UI系统。
public class Startup { public IConfiguration Configuration { get; } public Startup(IConfiguration configuration) { Configuration = configuration; } public void ConfigureServices(IServiceCollection services) { // Configure ASP.NET Core Identity + EF Core services.AddDbContext<AppDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")) ); services.AddDefaultIdentity<IdentityUser>() .AddEntityFrameworkStores<AppDbContext>(); // Add Razor Pages services services.AddRazorPages(); // Add base authorization services services.AddAuthorization(); } public void Configure(IApplicationBuilder app) { app.UseStaticFiles(); // Ensure the following middleware are in the order shown app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { // Add Razor Pages to the application endpoints.MapRazorPages(); }); } }
此时,您具有身份验证,并且您希望开始保护您的应用程序。您可以将[Authorize]属性应用到每个 Razor 页面,但您希望更简单一点,并在全局内将授权应用到程序中的所有页面。这对应本文的其余部分,我们查看可用的各种选项。
使用AuthorizeFilter来全局设置
(1)将授权过滤器在全局应用于您的所有 MVC 操作和Razor页面。这是传统上在早期版本的 ASP.NET 核心中使用的方法。
例如,在配置服务中配置Razor Pages时,您可以将授权过滤器添加到所有Razor Pages操作中(您可以以类似的方式配置 MVC 控制器)
public void ConfigureServices(IServiceCollection services) { // ...other config as before // Add a default AuthorizeFilter to all endpoints services.AddRazorPages() .AddMvcOptions(options => options.Filters.Add(new AuthorizeFilter())); }
这相当于用[Authorize]属性修饰所有Razor 方法,因此用户有权使用默认政策(下面将对此进行更多介绍!),默认情况下只需要经过验证的用户。如果您未获得身份验证,您将被重定向到Razor Pages应用的登录页面(或者收到 API 的 401 响应)。
如果您想应用不同的策略,您可以在授权过滤器的构造器中指定一个:
public void ConfigureServices(IServiceCollection services) { // ...other config as before // Pass a policy in the constructor of the Authorization filter services.AddRazorPages() .AddMvcOptions(options => options.Filters.Add(new AuthorizeFilter("MyCustomPolicy"))); // Configure the custom policy services.AddAuthorization(options => { options.AddPolicy("MyCustomPolicy", policyBuilder => policyBuilder.RequireClaim("SomeClaim")); }); }
授权筛选器仍然在全局范围内应用,因此用户始终需要登录,但现在他们还必须满足"我的客户政策"政策。如果他们不这样做,他们将被重定向到Razor Pages应用程序的访问被拒绝的页面(或接收API的403)。
请注意:此策略适用于全局,因此您需要确保您的"登录"和"访问"页面有修饰 [AllowAnonymous],否则您最终会获得无尽的重定向。
应用授权过滤器是早期版本的 ASP.NET Core的标准方法,但 ASP.NET Core 3.0 引入了端点路由。端点路由允许将一些以前仅限 MVC 的功能移植为通用功能模块。授权是这些功能之一!
使用RequireAuthorization在endpoint中来启用验证
授权过滤器方法最大的问题是它是仅限 MVC 。ASP.NET Core3.0+为终端设置授权提供了不同的机制—— 在IEndpointConventionBuilder中写了 扩展方法 RequireAuthorization()。
所有可以在Configure方法中配置Endpoins时使用RequireAuthorization()扩展方法就可以配置全局授权验证。
public void ConfigureServices(IServiceCollection services) { // ...other config as before // No need to add extra filters services.AddRazorPages(); // Default authorization services services.AddAuthorization(); } public void Configure(IApplicationBuilder app) { app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { // Require Authorization for all your Razor Pages endpoints.MapRazorPages().RequireAuthorization(); }); }
其效果与MVC的全局授权过滤器相同。那么为什么要使用这种方法呢?一个很大的优势是能够为其他端点(不是 MVC 或Razor Pages)添加授权。例如,您可能单个指定终点(health)进行身份验证的请求:
app.UseEndpoints(endpoints => { // Require Authorization for all your Razor Pages endpoints.MapRazorPages().RequireAuthorization(); // Also require authorization for your health check endpoints endpoints.MapHealthChecks("/healthz").RequireAuthorization(); });
与以前一样,您可以指定不同的策略,只需要调用RequireAuthorization()。您还可以提供不同的策略来申请不同的端点。在下面的示例中,我将"MyCustomPolicy"策略应用到 Razor 页面端点,并将两个策略"OtherPolicy"和"MainPolicy"应用于”health “端点:
app.UseEndpoints(endpoints => { // Require Authorization for all your Razor Pages endpoints.MapRazorPages().RequireAuthorization("MyCustomPolicy"); // Also require authorization for your health check endpoints endpoints.MapHealthChecks("/healthz").RequireAuthorization("OtherPolicy", "MainPolicy"); });
如果您在RequireAuthorization()中不提供策略名称,则适用默认政策。这与使用没有策略名称的 [Authorize] 过滤器的行为相同。
修改程序的默认策略
默认授权政策使用情况如下:
可以需要授权验证时使用Authorize标识,你可以使用RequireAuthorization()或者添加AuthorizeFilter,来启用你的授权,当您没有指定使用哪种策略时就使用这个规则,这是一个开箱即用程序,默认政策的程序示例如下:
new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build();
这就意味着,通过身份验证授权,则可以访问。未经授权的用户则被重定向到登录页面,但允许任何经过验证的用户访问页面。
您可以更改默认政策,可以使用 [Authorize] 属性限定在UseAuthorization()中应用不同的策略。例如,下面将默认政策设置为要求用户拥有"SomeClaim"的策略。
public void ConfigureServices(IServiceCollection services) { // ...other config as before services.AddRazorPages(); services.AddAuthorization(options => { // Configure the default policy options.DefaultPolicy = new AuthorizationPolicyBuilder() .RequireClaim("SomeClaim") .Build(); // ...other policy configuration }); } public void Configure(IApplicationBuilder app) { app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { // The default policy applies here, as no other policy set endpoints.MapRazorPages().RequireAuthorization(); // DefaultPolicy not used, as OtherPolicy is provided endpoints.MapHealthChecks("/healthz").RequireAuthorization("OtherPolicy"); // DefaultPolicy not applied, as authorization not required endpoints.MapHealthChecks("/ready"); }); }
上述代码展示了何时使用默认政策,何时使用其他策略。最下面的代码可以在指定的端点使用相应的策略。
设置默认策略可能非常有用,但有时您希望对何时应用策略有稍微细化的控制。例如,在 Razor Pages 应用程序中,您可能希望将给定策略应用于一个文件夹,将不同的策略应用到另一个文件夹或区域。您可以使用Razor Pages 约定实现这一点。
使用约束来构建授权策略
Razor Pages 框架围绕一整套约定进行设计,旨在便于快速构建应用程序。但是,当应用启动时,您几乎可以自定义所有这些约定,授权也不例外。
Razor Pages 约定允许您根据文件夹、区域或页面设置授权要求。它们还允许您在需要通过默认授权策略指定特殊情况,通过"AllowAnonymous"标记部分和页面。此功能的文档非常出色,因此我刚刚提供了以下简短示例:
public void ConfigureServices(IServiceCollection services) { // ...other config as before // Applying multiple conventions services.AddRazorPages(options => { // These apply authorization policies to various folders and pages options.Conventions.AuthorizeAreaFolder("Users", "/Accounts"); options.Conventions.AuthorizePage("/ChangePassword"); // You can provide the policy as an optional parameter, otherwise the DefaultPolicy is used options.Conventions.AuthorizeFolder("/Management", "MyCustomPolicy"); // You can also configure [AllowAnonymous] for pages/folders/areas options.Conventions.AllowAnonymousToAreaPage("Identity", "/Account/AccessDenied"); }); services.AddAuthorization(options => { // ...other policy configuration }); }
这些约定可用于将授权策略广泛应用于应用程序的各个部分。但是,如果您只想在任何地方申请授权呢?这就是”FallbackPolicy“的用武之地。
使用FallbackPolicy来灵活控制授权
当以下情况属实时,适用FallbackPolicy:
端点不应用任何授权。没有[Authorize]属性,没有RequireAuthorization,什么都没有。
终点没有明确或使用约定应用[AllowAnonymous]。
因此,FallbackPolicy仅适用于不应用任何其他类型的授权策略(包括默认政策)时。
默认情况下,FallbackPolicy是无操作的:它允许所有请求未经授权。您可以在使用授权时以与默认政策相同的方式更改FallbackPolicy:
public void ConfigureServices(IServiceCollection services) { // ...other config as before services.AddRazorPages(); services.AddAuthorization(options => { // Configure the default policy options.FallbackPolicy = new AuthorizationPolicyBuilder() .RequireClaim("SomeClaim") .Build(); // ...other policy configuration }); } public void Configure(IApplicationBuilder app) { app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { // The FallbackPolicy applies here, as no other policy set endpoints.MapRazorPages() // FallbackPolicy not used, as authorization applied endpoints.MapHealthChecks("/healthz").RequireAuthorization("OtherPolicy"); // FallbackPolicy not used, as DefaultPolicy applied endpoints.MapHealthChecks("/ready").RequireAuthorization(); }); }
在上面的示例中,FallbackPolicy设置为自定义策略。它仅适用于Razor Pages ,因为health检查端点已指定"OtherPolicy"和默认政策授权要求。
结合默认政策、FallbackPolicy、Razor Pages约定和"RequireAuthorization() ",您有多种方法在应用程序中"全局"应用授权。请记住,您始终可以通过将 [Authorize] 或 [AllowAnonymous]属性直接应用到Razor Pages 或操作方法来超越默认政策和FallbackPolicy,从而实现更具体的行为。
总结
在这篇文章中,我描述了可用于设置全局授权策略的各种选项:
●在全局范围内应用AuthorizeFilter。这不再是推荐的方法,因为它仅限于 MVC/Razor。
●在"UseEndpoints"使用RequireAuthorization()。您可以指定要申请的策略,或留空以应用默认政策。
●在方法”AddRazorPages“中可以使用conventions 对RazorPages应用授权。您可以使用这些约定指定应用授权策略和[AllowAnonymous]。
●当您指定需要授权时,将适用默认政策(DefaultPolicy),但不指定应用策略。默认情况下,默认政策授权所有已验证的用户。
●当未指定授权要求(包括[Authorize]属性)时,则适用"FallbackPolicy"。默认情况下,FallbackPolicy不适用任何授权。
本文作者:Jason.裕哥
本文链接:https://www.cnblogs.com/fuyu-blog/articles/16188749.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步