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
相关产品推荐
相关产品推荐

