You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于appsettings.json配置为ASP.NET Core的PageModel条件添加权限属性

实现方案

方案1:使用Razor Pages授权约定(推荐)

该方案无需修改PageModel代码,在应用启动时直接读取appsettings.json配置,批量给对应页面添加授权规则,是ASP.NET Core官方推荐的标准实现。

  1. 首先在appsettings.json中添加配置项:
{
  "PageAccess": {
    "EnableIndexPageAuth": true
  }
}
  1. 随后在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:自定义动态授权属性(支持运行时动态生效)

如果你需要支持运行时修改配置不重启就生效,或者规则需要和请求上下文关联,可以用自定义授权过滤器实现。

  1. 首先实现自定义属性:
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();
        }
    }
}
  1. 直接给PageModel标记该属性即可:
[DynamicAuth("PageAccess:EnableIndexPageAuth")]
public class IndexModel : PageModel
{
    // 原有业务代码
}

关键说明

  • C#的Attribute是编译时元数据,无法在运行时动态修改类上的Attribute定义,所以你最初设想的boolCondition ? [Authorize] : [AllowAnonymous]语法并不支持,也无法通过自定义属性返回不同Attribute的方式实现。
  • 方案1适合规则固定、启动后不需要变更的场景,方案2适合需要运行时动态调整规则的场景,可根据实际需求选择。

内容的提问来源于stack exchange,提问作者Jethro Cao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 23:57:05