如何同时配置Role和Policy允许对应身份访问Controller的Action方法
方案说明
直接叠加两个[Authorize]特性默认是与逻辑,要求用户同时满足Reader角色和Reader策略才可访问,如果你需要的是满足任意一个即可访问,可以选择以下两种常用实现方式:
方案1:修改原有Reader策略,追加角色校验规则
在服务注册的授权配置位置(.NET 6+ 为Program.cs,旧版本为Startup.cs的ConfigureServices方法)修改策略定义:
builder.Services.AddAuthorization(options => { options.AddPolicy(Policy.Reader, policy => { // 保留你原有Reader策略的所有校验规则,比如: policy.RequireAuthenticatedUser(); // 新增角色校验,满足Reader角色也可通过该策略 policy.RequireRole(Role.Reader); // 其他原有策略规则继续在此追加 }); });
修改完成后Action上只需要保留[Authorize(Policy = Policy.Reader)]标记即可,符合角色或原有策略规则的用户都可以访问该方法。
方案2:新增独立的复合策略
如果你不想修改原有Reader策略的逻辑,可以单独定义一个满足「Reader策略 或 Reader角色」的新策略:
builder.Services.AddAuthorization(options => { // 原有Reader策略的定义保持不变 options.AddPolicy(Policy.Reader, policy => { // 原有规则不变 }); // 新增复合策略 options.AddPolicy("ReaderPolicyOrRole", policy => { policy.RequireAssertion(async context => { // 有Reader角色直接通过 if (context.User.IsInRole(Role.Reader)) return true; // 没有角色则校验是否符合原有Reader策略 var policyResult = await context.AuthorizationService.AuthorizeAsync(context.User, Policy.Reader); return policyResult.Succeeded; }); }); });
之后在Action上标记[Authorize(Policy = "ReaderPolicyOrRole")]即可。
如果你需要的就是必须同时满足Reader角色和Reader策略才可访问,直接在方法上叠加两个
[Authorize]标记即可生效,无需额外配置:[Authorize(Roles = Role.Reader)] [Authorize(Policy = Policy.Reader)] public IActionResult YourAction() { // 方法逻辑 }
内容的提问来源于stack exchange,提问作者Athul Gopal
相关产品推荐
相关产品推荐

