Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Asp.Net核心策略处理程序未触发_C#_Asp.net Core - Fatal编程技术网

C# Asp.Net核心策略处理程序未触发

C# Asp.Net核心策略处理程序未触发,c#,asp.net-core,C#,Asp.net Core,说真的,我做错了什么?如果另一个政策与另一个政策相反,这怎么可能不起作用?名称上只有3个字母更改,并进行反向布尔检查 策略hasaranqueactivo正在运行。我使用调试器进行测试,它会触发它 以下是申报的保单 services.AddAuthorization(options => { options.AddPolicy("HasArranqueActivo", policy => policy.Requirements.Add(new HasArran

说真的,我做错了什么?如果另一个政策与另一个政策相反,这怎么可能不起作用?名称上只有3个字母更改,并进行反向布尔检查

策略
hasaranqueactivo
正在运行。我使用调试器进行测试,它会触发它

以下是申报的保单

services.AddAuthorization(options =>
{
    options.AddPolicy("HasArranqueActivo", policy =>
        policy.Requirements.Add(new HasArranqueActivoRequirement()
    ));

    options.AddPolicy("HasArranqueInactivo", policy =>
        policy.Requirements.Add(new HasArranqueInactivoRequirement()
    ));
});
正如您所看到的,这两个处理程序基本上是相同的

public class HasArranqueActivoHandler : AuthorizationHandler<HasArranqueActivoRequirement>
{
    private readonly NoPaperContext _context;

    public HasArranqueActivoHandler(NoPaperContext context)
    {
        _context = context;
    }

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, HasArranqueActivoRequirement requirement)
    {
        // Do something with _context
        // Check if the requirement is fulfilled.
        var registoId = Convert.ToInt32(context.User.FindFirst(c => c.Type == ClaimTypes.PrimarySid).Value);
        var registo = _context.Registos.Find(registoId);

        if (registo.IsArranqueActivo)
        {
            context.Succeed(requirement);
        }            

        return Task.CompletedTask;
    }
}

public class HasArranqueInactivoHandler : AuthorizationHandler<HasArranqueInactivoRequirement>
{
    private readonly NoPaperContext _context;

    public HasArranqueInactivoHandler(NoPaperContext context)
    {
        _context = context;
    }

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, HasArranqueInactivoRequirement requirement)
    {
        // Do something with _context
        // Check if the requirement is fulfilled.
        var registoId = Convert.ToInt32(context.User.FindFirst(c => c.Type == ClaimTypes.PrimarySid).Value);
        var registo = _context.Registos.Find(registoId);

        if (!registo.IsArranqueActivo)
        {
            context.Succeed(requirement);
        }

        return Task.CompletedTask;
    }
}
编辑

这就是整个启动过程

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddAuthentication()
            .AddCookie("ProductionAuth", options =>
            {
                options.ExpireTimeSpan = TimeSpan.FromDays(1);
                options.LoginPath = new PathString("/Production/Index");
                options.LogoutPath = new PathString("/Production/Logout");
                options.AccessDeniedPath = new PathString("/Production/AccessDenied/");
                options.SlidingExpiration = true;
            })
        .AddCookie("AdministrationAuth", options =>
        {
            options.ExpireTimeSpan = TimeSpan.FromDays(1);
            options.LoginPath = new PathString("/Administration/Index");
            options.LogoutPath = new PathString("/Administration/Logout");
            options.AccessDeniedPath = new PathString("/Administration/AccessDenied/");
            options.SlidingExpiration = true;
        });

        services.AddAuthorization(options =>
        {
            options.AddPolicy("HasArranqueActivo", policy =>
                policy.Requirements.Add(new HasArranqueActivoRequirement()
            ));

            options.AddPolicy("HasArranqueInactivo", policy =>
                policy.Requirements.Add(new HasArranqueInactivoRequirement()
            ));
        });




        services.AddSingleton<IFileProvider>(
            new PhysicalFileProvider(
        Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/files")));




        services.AddMvc()
            .AddRazorPagesOptions(options =>
            {
                options.AllowAreas = true;
                options.Conventions.AuthorizeAreaFolder("Administration", "/Account");
                options.Conventions.AuthorizeAreaFolder("Production", "/Account");
            })
            .AddNToastNotifyToastr(new ToastrOptions()
            {
                ProgressBar = true,
                TimeOut = 3000,
                PositionClass = ToastPositions.TopFullWidth,
                PreventDuplicates = true,
                TapToDismiss = true
            })
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        services.AddTransient<IAuthorizationHandler, HasArranqueActivoHandler>();
        services.AddRouting(options =>
        {
            options.LowercaseUrls = true;
            options.LowercaseQueryStrings = true;
        });

        services.AddDbContext<NoPaperContext>(options =>
        {
            //if(Environment.IsProduction())
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"), sqlServerOptionsAction: sqlOptions =>
            {
                sqlOptions.EnableRetryOnFailure(
                    maxRetryCount: 2,
                    maxRetryDelay: TimeSpan.FromSeconds(1),
                    errorNumbersToAdd: null);
            });
            //else if(Environment.IsDevelopment())
            //options.UseInMemoryDatabase(databaseName: "AbastecimentoDB");
        });

        services.AddHttpContextAccessor();
        services.AddTransient<IComponenteService, ComponenteService>();
        services.AddTransient<IReferenciaService, ReferenciaService>();
        services.AddTransient<IRegistoService, RegistoService>();
        services.AddTransient<IParagemService, ParagemService>();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
        }

        app.UseNToastNotify();
        app.UseAuthentication();
        app.UseStaticFiles();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}
公共类启动
{
公共启动(IConfiguration配置)
{
配置=配置;
}
公共IConfiguration配置{get;}
//此方法由运行时调用。请使用此方法将服务添加到容器中。
public void配置服务(IServiceCollection服务)
{
services.AddAuthentication()
.AddCookie(“ProductionAuth”,选项=>
{
options.ExpireTimeSpan=TimeSpan.FromDays(1);
options.LoginPath=新路径字符串(“/Production/Index”);
options.LogoutPath=新路径字符串(“/Production/Logout”);
options.AccessDeniedPath=新路径字符串(“/Production/AccessDenied/”;
options.SlidingExpiration=true;
})
.AddCookie(“管理权限”,选项=>
{
options.ExpireTimeSpan=TimeSpan.FromDays(1);
options.LoginPath=新路径字符串(“/Administration/Index”);
options.LogoutPath=新路径字符串(“/Administration/Logout”);
options.AccessDeniedPath=新路径字符串(“/Administration/AccessDeniedPath/”;
options.SlidingExpiration=true;
});
services.AddAuthorization(选项=>
{
options.AddPolicy(“hasaranqueactivo”,policy=>
policy.Requirements.Add(新的hasArranqueActionRequest()
));
options.AddPolicy(“hasaranqueinactivo”,policy=>
policy.Requirements.Add(新的HasArranqueInactivoRequirement()
));
});
服务.AddSingleton(
新的PhysicalFileProvider(
Combine(Directory.GetCurrentDirectory(),“wwwroot/files”);
services.AddMvc()
.AddRazorPagesOptions(选项=>
{
options.AllowAreas=true;
options.Conventions.AuthorizeAreaFolder(“管理”和“/Account”);
options.Conventions.AuthorizeAreaFolder(“生产”和“/Account”);
})
.AddNToastNotifyToastr(新ToastrOptions()
{
ProgressBar=true,
超时=3000,
PositionClass=ToastPositions.TopFullWidth,
防止重复=真,
TapToDismiss=true
})
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddTransient();
services.AddRouting(选项=>
{
options.LowercaseUrls=true;
options.LowercaseQueryStrings=true;
});
services.AddDbContext(选项=>
{
//if(Environment.IsProduction())
options.UseSqlServer(Configuration.GetConnectionString(“DefaultConnection”),SQLServerOptions操作:sqlOptions=>
{
sqlOptions.EnableRetryOnFailure(
maxRetryCount:2,
maxRetryDelay:TimeSpan.FromSeconds(1),
errorNumbersToAdd:null);
});
//else if(Environment.IsDevelopment())
//选项。使用MemoryDatabase(数据库名称:“AbastecimentoDB”);
});
AddHttpContextAccessor();
services.AddTransient();
services.AddTransient();
services.AddTransient();
services.AddTransient();
}
//此方法由运行时调用。请使用此方法配置HTTP请求管道。
公共无效配置(IApplicationBuilder应用程序,IHostingEnvironment环境)
{
if(env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
其他的
{
app.UseExceptionHandler(“/Error”);
}
app.UseNToastNotify();
app.UseAuthentication();
app.UseStaticFiles();
app.UseMvc(路由=>
{
routes.MapRoute(
名称:“默认”,
模板:“{controller=Home}/{action=Index}/{id?}”);
});
}
}

对于
hasaranqueactivohandler
,您已在
ConfigureServices
中添加了服务注册:

iaauthorizationhandler
的实现是从DI容器中解析的,因此缺少注册意味着authz系统无法处理您为
hasaranqueinactivo
策略设置的
hasaranqueinactivo要求

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddAuthentication()
            .AddCookie("ProductionAuth", options =>
            {
                options.ExpireTimeSpan = TimeSpan.FromDays(1);
                options.LoginPath = new PathString("/Production/Index");
                options.LogoutPath = new PathString("/Production/Logout");
                options.AccessDeniedPath = new PathString("/Production/AccessDenied/");
                options.SlidingExpiration = true;
            })
        .AddCookie("AdministrationAuth", options =>
        {
            options.ExpireTimeSpan = TimeSpan.FromDays(1);
            options.LoginPath = new PathString("/Administration/Index");
            options.LogoutPath = new PathString("/Administration/Logout");
            options.AccessDeniedPath = new PathString("/Administration/AccessDenied/");
            options.SlidingExpiration = true;
        });

        services.AddAuthorization(options =>
        {
            options.AddPolicy("HasArranqueActivo", policy =>
                policy.Requirements.Add(new HasArranqueActivoRequirement()
            ));

            options.AddPolicy("HasArranqueInactivo", policy =>
                policy.Requirements.Add(new HasArranqueInactivoRequirement()
            ));
        });




        services.AddSingleton<IFileProvider>(
            new PhysicalFileProvider(
        Path.Combine(Directory.GetCurrentDirectory(), "wwwroot/files")));




        services.AddMvc()
            .AddRazorPagesOptions(options =>
            {
                options.AllowAreas = true;
                options.Conventions.AuthorizeAreaFolder("Administration", "/Account");
                options.Conventions.AuthorizeAreaFolder("Production", "/Account");
            })
            .AddNToastNotifyToastr(new ToastrOptions()
            {
                ProgressBar = true,
                TimeOut = 3000,
                PositionClass = ToastPositions.TopFullWidth,
                PreventDuplicates = true,
                TapToDismiss = true
            })
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
        services.AddTransient<IAuthorizationHandler, HasArranqueActivoHandler>();
        services.AddRouting(options =>
        {
            options.LowercaseUrls = true;
            options.LowercaseQueryStrings = true;
        });

        services.AddDbContext<NoPaperContext>(options =>
        {
            //if(Environment.IsProduction())
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"), sqlServerOptionsAction: sqlOptions =>
            {
                sqlOptions.EnableRetryOnFailure(
                    maxRetryCount: 2,
                    maxRetryDelay: TimeSpan.FromSeconds(1),
                    errorNumbersToAdd: null);
            });
            //else if(Environment.IsDevelopment())
            //options.UseInMemoryDatabase(databaseName: "AbastecimentoDB");
        });

        services.AddHttpContextAccessor();
        services.AddTransient<IComponenteService, ComponenteService>();
        services.AddTransient<IReferenciaService, ReferenciaService>();
        services.AddTransient<IRegistoService, RegistoService>();
        services.AddTransient<IParagemService, ParagemService>();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
        }

        app.UseNToastNotify();
        app.UseAuthentication();
        app.UseStaticFiles();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}
services.AddTransient<IAuthorizationHandler, HasArranqueActivoHandler>();
services.AddTransient<IAuthorizationHandler, HasArranqueInactivoHandler>();