如何基于appsettings.json配置为ASP.NET Core的PageModel条件添加权限属性
实现方案
方案1:使用Razor Pages授权约定(推荐)
该方案无需修改PageModel代码,在应用启动时直接读取appsettings.json配置,批量给对应页面添加授权规则,是ASP.NET Core官方推荐的标准实现。
- 首先在
appsettings.json中添加配置项:
{ "PageAccess": { "EnableIndexPageAuth": true } }
- 随后在
Program.cs中配置授权规则:
var builder = WebApplication.CreateBuilder(args); // 读取配置 bool enableIndexAuth = builder.Configuration.GetValue<bool>("PageAccess:EnableIndexPageAuth"); builder.Services.AddRazorPages(options => { // 配置单页面规则 if (enableIndexAuth) { options.Conventions.AuthorizePage("/Index"); } else { options.Conventions.AllowAnonymousToPage("/Index"); } // 批量控制文件夹下所有页面可以用以下方法 // if (enableFolderAuth) // { // options.Conventions.AuthorizeFolder("/Manage"); // } // else // { // options.Conventions.AllowAnonymousToFolder("/Manage"); // } }); // 注册认证授权服务 builder.Services.AddAuthentication().AddCookie(/* 你的认证配置 */); builder.Services.AddAuthorization(); var app = builder.Build(); // 注意中间件顺序不能调换 app.UseAuthentication(); app.UseAuthorization(); app.MapRazorPages(); app.Run();
该方案优势是规则在启动时确定,性能更高,逻辑集中便于维护。
方案2:自定义动态授权属性(支持运行时动态生效)
如果你需要支持运行时修改配置不重启就生效,或者规则需要和请求上下文关联,可以用自定义授权过滤器实现。
- 首先实现自定义属性:
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.Extensions.Configuration; public class DynamicAuthAttribute : Attribute, IAsyncAuthorizationFilter { private readonly string _configKey; public DynamicAuthAttribute(string configKey) { _configKey = configKey; } public async Task OnAuthorizationAsync(AuthorizationFilterContext context) { var config = context.HttpContext.RequestServices.GetRequiredService<IConfiguration>(); bool needAuth = config.GetValue<bool>(_configKey); // 配置为不需要授权直接放行 if (!needAuth) return; // 需要授权时走默认校验逻辑 var authService = context.HttpContext.RequestServices.GetRequiredService<IAuthorizationService>(); var authResult = await authService.AuthorizeAsync(context.HttpContext.User, null); if (!authResult.Succeeded) { context.Result = new ChallengeResult(); } } }
- 直接给PageModel标记该属性即可:
[DynamicAuth("PageAccess:EnableIndexPageAuth")] public class IndexModel : PageModel { // 原有业务代码 }
关键说明
- C#的Attribute是编译时元数据,无法在运行时动态修改类上的Attribute定义,所以你最初设想的
boolCondition ? [Authorize] : [AllowAnonymous]语法并不支持,也无法通过自定义属性返回不同Attribute的方式实现。 - 方案1适合规则固定、启动后不需要变更的场景,方案2适合需要运行时动态调整规则的场景,可根据实际需求选择。
内容的提问来源于stack exchange,提问作者Jethro Cao
相关产品推荐
相关产品推荐

