如何在.NET 5 Razor Pages中为除Admin外所有区域设置统一Identity授权策略
问题根因
你之前使用的options.Conventions.AuthorizeAreaFolder("/", "/", Role.Staff)无法生效,原因是该方法的第一个参数需要传入明确的Area名称,不支持通配符匹配所有Area,所以无法实现全局Area默认授权的效果。
解决方案
通过自定义Razor Pages约定实现批量授权规则配置,后续新增Area无需额外修改授权配置即可自动应用默认规则:
- 首先实现自定义约定类
using Microsoft.AspNetCore.Mvc.ApplicationModels; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc.Authorization; public class GlobalAreaAuthorizeConvention : IPageConvention { private readonly string _defaultAreaPolicy; private readonly string _adminAreaPolicy; private const string AdminAreaName = "Admin"; public GlobalAreaAuthorizeConvention(string defaultAreaPolicy, string adminAreaPolicy) { _defaultAreaPolicy = defaultAreaPolicy; _adminAreaPolicy = adminAreaPolicy; } public void Apply(PageApplicationModel pageModel) { // 仅处理属于Area的页面 if (string.IsNullOrEmpty(pageModel.AreaName)) return; var authorizeAttribute = pageModel.AreaName.Equals(AdminAreaName, StringComparison.OrdinalIgnoreCase) ? new AuthorizeAttribute(_adminAreaPolicy) : new AuthorizeAttribute(_defaultAreaPolicy); pageModel.Filters.Add(new AuthorizeFilter(authorizeAttribute)); } }
- 修改服务注册代码,删除原来所有逐个声明Area授权的配置,替换为自定义约定的注册
// 注册授权策略 services.AddAuthorization(options => { options.AddPolicy("Staff", p => p.RequireRole(Role.Staff)); options.AddPolicy("Admin", p => p.RequireRole(Role.Admin)); }); // 配置Razor Pages services.AddRazorPages(options => { // 保留根目录非Area页面的授权规则 options.Conventions.AuthorizeFolder("/", "Staff"); // 注册全局Area授权约定 options.Conventions.Add(new GlobalAreaAuthorizeConvention("Staff", "Admin")); // 保留匿名访问配置 options.Conventions.AllowAnonymousToPage("/Index"); options.Conventions.AllowAnonymousToPage("/Error"); });
配置效果
- 所有Area(包括后续新增的Area)会默认应用Staff授权策略,无需额外配置
- Admin区域会自动应用Admin授权策略,优先级高于默认规则
- 若存在特殊Area需要自定义权限,可以继续通过
AuthorizeAreaFolder/AuthorizeAreaPage显式配置,优先级高于全局约定
内容的提问来源于stack exchange,提问作者Jonathan Wood
相关产品推荐
相关产品推荐

