【问题标题】:How to Inject ControllerContext in startup.cs in ASP.Net-Core 2.2如何在 ASP.Net-Core 2.2 的 startup.cs 中注入 ControllerContext
【发布时间】:2020-01-04 20:45:21
【问题描述】:

我有一个用例,每个登录用户都有一组 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;
    }
}

由于 AccessPermissionRequirement 类需要在构造函数中注入 ControllerContext 以便我能够访问当前请求(在控制器之外),我发现很难在 Startup 的 ConfigureServices 方法中注册策略。 cs 类。

以下是我所做的不起作用的事情

 services.AddAuthorization(options => {
            options.AddPolicy("CheckAccess", policy => policy.Requirements.Add(new AccessPermissionRequirement(ControllerContext controllerContext)));
        });

我收到以下错误

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

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

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

我将不胜感激解决此问题的指南。

谢谢

【问题讨论】:

  • 您可以从需求中删除 ControllerContext。 requirement 实际上只是一个保存参数的容器。 RequirementHandler 可以访问上下文并处理需求。

标签: c# access-control asp.net-core-2.2 asp.net-authorization


【解决方案1】:

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

How do you create a custom AuthorizeAttribute in ASP.NET Core?

【讨论】:

  • 是的。如果我没有找到使用授权策略的解决方案,这就是我目前正在尝试实施的替代方案。感谢您确认
猜你喜欢
  • 1970-01-01
  • 2017-05-15
  • 2020-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多