Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.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-Core 2.2的startup.cs中注入ControllerContext_C#_Access Control_Asp.net Core 2.2_Asp.net Authorization - Fatal编程技术网

C# 如何在ASP.Net-Core 2.2的startup.cs中注入ControllerContext

C# 如何在ASP.Net-Core 2.2的startup.cs中注入ControllerContext,c#,access-control,asp.net-core-2.2,asp.net-authorization,C#,Access Control,Asp.net Core 2.2,Asp.net Authorization,我有一个用例,每个登录的用户都有一组他/她可以访问的URL,而不管他/她的角色是什么。我正在尝试在ASP.Net-core 2.2中实现一个策略来实现这一点。 当用户注册时,用户可访问的每个URL都将注册为声明,并且当认证用户发出请求时,尝试将请求的URL/路径与为用户注册的URL声明进行比较 因为我试图使用授权策略来实现这一点,所以我创建了以下授权需求和处理程序 public class AccessPermissionRequirement : IAuthorizationRequireme

我有一个用例,每个登录的用户都有一组他/她可以访问的URL,而不管他/她的角色是什么。我正在尝试在ASP.Net-core 2.2中实现一个策略来实现这一点。 当用户注册时,用户可访问的每个URL都将注册为声明,并且当认证用户发出请求时,尝试将请求的URL/路径与为用户注册的URL声明进行比较

因为我试图使用授权策略来实现这一点,所以我创建了以下授权需求和处理程序

public class AccessPermissionRequirement : IAuthorizationRequirement
{
    public ControllerContext controllerContext { get; }
    public string routeArea = "";

    public AccessPermissionRequirement(ControllerContext _controllerContext, string RouteArea ="")
    {
        controllerContext = _controllerContext;
        routeArea = RouteArea;
    }

}

public class AccessPermissionHandler : AuthorizationHandler<AccessPermissionRequirement>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, AccessPermissionRequirement requirement)
    {
        if (!context.User.Identity.IsAuthenticated)
        {
            return Task.CompletedTask;
        }
        var actionName = requirement.controllerContext.ActionDescriptor.ActionName;
        var controllerName = requirement.controllerContext.ActionDescriptor.ControllerName;

        var route = controllerName + "/" + actionName;
        if (context.User.HasClaim("Routes", route))
        {
            context.Succeed(requirement);
        }
        return Task.CompletedTask;
    }
}
我得到以下错误

ControllerContext是在给定上下文中无效的类型

所以,我被困在这里,因为我不知道如何解决这个问题

抱歉,这是我第一次尝试在ASP.Net-core中实现策略

我希望能有一个解决这个问题的指南


谢谢

看来,
iaauthorizationfilter
非常适合您的情况。关于这一点,有一个很好的讨论:


是 啊如果我没有获得使用授权策略的解决方案,那么这就是我目前试图实现的替代方案。感谢您确认您可以从需求中删除ControllerContext。实际上,它只是一个保存参数的容器。是RequirementHandler可以访问上下文并处理需求。
 services.AddAuthorization(options => {
            options.AddPolicy("CheckAccess", policy => policy.Requirements.Add(new AccessPermissionRequirement(ControllerContext controllerContext)));
        });