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

ASP.NET Core 6 Razor Pages如何创建反权限策略?

实现带禁止权限(NoPermission)的基于声明的授权方案

核心思路

不能直接通过否定[Authorize]属性实现需求,要把禁止权限优先的逻辑整合到原权限策略中:用户必须拥有目标权限声明,且不拥有对应的禁止权限声明,才允许访问。

步骤1:优化权限定义(可选但推荐)

在Permissions.cs中添加生成禁止权限名称的辅助方法,避免硬编码字符串:

public class Permissions
{
    public static List<string> AllPermissions()
    {
        var permissions = new List<string>();
        permissions.AddRange(Users.AllPermissions());
        return permissions;
    }

    // 生成禁止权限的统一方法
    public static string GetNoPermission(string permission)
    {
        return $"No.{permission}";
    }

    public static class Users
    {
        public const string View = "Permissions.Users.View";
        public const string Create = "Permissions.Users.Create";
        public const string Edit = "Permissions.Users.Edit";
        public const string Deactivate = "Permissions.Users.Deactivate";
        public const string Delete = "Permissions.Users.Delete";

        public static List<string> AllPermissions()
        {
            return new List<string>()
            {
                View,
                Create,
                Edit,
                Deactivate,
                Delete
            };
        }
    }
}

步骤2:修改授权策略配置

在Program.cs中替换原有策略添加逻辑,使用RequireAssertion实现自定义权限检查:

builder.Services.AddAuthorization(options =>
{
    foreach (string permission in Permissions.AllPermissions())
    {
        var noPermission = Permissions.GetNoPermission(permission);
        options.AddPolicy(permission, policy =>
            policy.RequireAssertion(context =>
                // 核心逻辑:拥有目标权限 + 无对应禁止权限
                context.User.HasClaim("Permission", permission) &&
                !context.User.HasClaim("NoPermission", permission)
            ));
    }
});

步骤3:使用授权策略

在cshtml.cs或控制器上,依然使用原有的[Authorize]属性即可——现在该策略已自动包含禁止权限的检查:

[Authorize(Policy = Permissions.Users.View)]
public class UsersIndexModel : PageModel
{
    // 页面业务逻辑
}

步骤4:分配禁止权限

当需要限制用户访问特定权限时,给用户添加NoPermission类型的声明,值为对应权限字符串即可。示例代码:

// 给用户添加禁止查看用户列表的权限声明
var userClaims = new List<Claim>
{
    new Claim("NoPermission", Permissions.Users.View)
};
// 将声明绑定到用户身份(具体实现根据你的身份认证方式调整)

逻辑验证场景

  • 用户仅拥有Permissions.Users.View的Permission声明:允许访问
  • 用户同时拥有Permissions.Users.View的Permission和NoPermission声明:禁止访问
  • 用户仅拥有Permissions.Users.View的NoPermission声明:禁止访问(不满足拥有目标权限的前提)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 07:35:16