asp.net-core - 具有多个要求的自定义授权策略在应用于控制器操作时不起作用
问题描述
我有一个 .NET Core 3 WebAPI,我想在其中使用基于策略的自定义授权,其中一个策略有多个要求。
我已将策略添加到 DI中Startup.ConfigureServices()
并添加到:MyCustomPolicyHandler
public virtual void ConfigureServices(IServiceCollection services)
{
services.AddAuthorization(options =>
{
options.AddPolicy("MyCustomPolicy", policy =>
{
policy.Requirements.Add(new RequirementA());
policy.Requirements.Add(new RequirementB());
policy.Requirements.Add(new RequirementC());
policy.Requirements.Add(new RequirementD());
});
services.AddScoped<IAuthorizationHandler, MyCustomPolicyHandler>();
});
}
我已经MyCustomPolicyHandler
使用本文档中的示例实现了:
ASP.NET Core 中基于策略的授权
public class MyCustomPolicyHandler: IAuthorizationHandler
{
public Task HandleAsync(AuthorizationHandlerContext context)
{
var pendingRequirements = context.PendingRequirements.ToList();
Console.WriteLine($"MyCustomPolicyHandler: {pendingRequirements.Count} requirements");
foreach (var requirement in pendingRequirements)
{
if(requirement is RequirementA) {
// do stuff to check the requirements
context.Succeed(requirement);
}
else if(requirement is RequirementB) {
// do stuff to check the requirements
context.Succeed(requirement);
}
else if(requirement is RequirementC) {
// do stuff to check the requirements
context.Succeed(requirement);
}
else if(requirement is RequirementD) {
// do stuff to check the requirements
context.Succeed(requirement);
}
}
return Task.CompletedTask;
}
}
接下来,我将策略应用于控制器操作之一:
public class MyController
{
[HttpGet]
[Authorize(Policy="MyCustomPolicy")]
public ActionResult<SomeViewModel> Get(int id) {
// do stuff
return Ok(vm);
}
}
我遇到的问题是没有与策略相关的要求。消息显示Console.WriteLine()
0 个要求:
MyCustomPolicyHandler: 0 requirements
如果我将策略移至控制器,则存在以下要求:
[Authorize(Policy="MyCustomPolicy")]
public class MyController
{
[HttpGet]
public ActionResult<SomeViewModel> Get(int id) {
// do stuff
return Ok(vm);
}
}
MyCustomPolicyHandler: 4 requirements
但是,我需要将此策略应用于操作,而不是控制器。[Authorize(Policy="MyCustomPolicy")] 属性应该在操作级别起作用。
知道为什么这不起作用吗?
谢谢。
解决方案
推荐阅读
- react-router - 如何将我的 NavLink 与原始 url 保留在反应组件中?
- google-apps-script - 试图确定如何对工作表进行不区分大小写的排序以输入 HTML 选择选项列表
- mysql - 如何编写 .net 核心 API 以通过 clientId 访问多个相同(模式)数据库(一次一个)
- python - 我需要加快日期时间迭代功能
- sql - 如何取消基于当前时间的数据?
- vue.js - Nuxt JS 中的嵌套动态路由
- webpack - 如何将 babel 配置为跨多个 webpack 入口点仅导入必要的 polyfill?
- python - 使用 FastAPI 计算具有全局变量的请求数
- python - GJK 算法创建具有两个相反点的单纯形
- java - Spring 数据存储库对具有不同 Id 的子类使用抽象超类