应用于控制器操作的具有多个需求的自定义授权策略不起作用

问题描述

我有一个.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 (将#修改为@)