【发布时间】: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