问题描述
我有一个.NET Core 3 WebAPI,我想在其中使用基于策略的自定义授权,其中一个策略有多个要求。
我已在SELECT distinct(DATE_FORMAT(playlistDate,'%Y/%m/%d')) from tracks
中添加了策略,并将Startup.ConfigureServices()
添加到了DI:
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>();
});
}
:
Policy-based authorization in ASP.NET Core
MyCustomPolicyHandler
接下来,我将策略应用于控制器操作之一:
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);
}
}
消息显示0个要求:
Console.WriteLine()
如果我将策略移至控制器,则存在以下要求:
MyCustomPolicyHandler: 0 requirements
[Authorize(Policy="MyCustomPolicy")]
public class MyController
{
[HttpGet]
public ActionResult<SomeViewModel> Get(int id) {
// do stuff
return Ok(vm);
}
}
但是,我需要将此策略应用于操作,而不是控制器。 [Authorize(Policy =“ MyCustomPolicy”)]属性应在操作级别起作用。
有人知道为什么这行不通吗?
谢谢。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)