如何在 AuthorizationHandler 中获取 Controller 和 Action?
How to get Controller and Action inside AuthorizationHandler?
我只是想知道是否可以在 AuthorizationHandler
中获得 Controller
和 Action
?!需要它才能根据请求的操作验证用户的角色。
我可以参考 HttpContext
。但是 HttpContext.Request.RouteValues
似乎无法访问。
有人知道吗?
我的代码:
public class RoleHandler :
AuthorizationHandler<RoleRequirement>
{
private readonly IUnitOfWork _context;
private readonly IHttpContextAccessor _httpContext;
public RoleHandler(IHttpContextAccessor httpContext, IUnitOfWork context)
{
_context = context;
_httpContext = httpContext;
}
protected override Task HandleRequirementAsync(
AuthorizationHandlerContext authorizationcontext,
RoleRequirement requirement)
{
var roleClaim = authorizationcontext.User.Claims
.Where(c =>
c.Type == ClaimTypes.Role);
var routeData = authorizationcontext.Resource ;
if (ThisRoleIsAllowed(roleClaim, requirement.ActionName).Result)
authorizationcontext.Succeed(requirement);
return Task.CompletedTask;
}
让我在这里总结一下我们到目前为止讨论的内容。
(我的目的是从评论中捕捉有价值的信息)。
OP 想要实现基于授权 的资源(端点)。 (ASP.NET 核心标准是基于角色的。)为此,需要以下信息:
- 已解析的控制器和动作名称(已解析表示基于路由 table,哪个控制器的哪个动作应处理特定请求)
基于这些和角色声明,授权逻辑可以轻松决定是否允许请求者访问资源。
为了能够检索控制器的名称和操作的名称,我建议如下:
- 在
HttpContext
上调用 GetEndPoint
extension method
- 在
Endpoint
上调用 GetMetadata<ControllerActionDescriptor>
- 在
ControllerActionDescriptor
(1) 上访问 ControllerName
和 ActionName
所以,总结一下:
public class RoleHandler: AuthorizationHandler<RoleRequirement>
{
private readonly IHttpContextAccessor _httpContextAccessor;
protected override Task HandleRequirementAsync
(AuthorizationHandlerContext authorizationcontext, RoleRequirement requirement)
{
var endpoint = _httpContextAccessor.HttpContext.GetEndpoint();
var descriptor = endpoint.Metadata.GetMetadata<ControllerActionDescriptor>();
var controllerName = descriptor.ControllerName;
//...
}
}
我只是想知道是否可以在 AuthorizationHandler
中获得 Controller
和 Action
?!需要它才能根据请求的操作验证用户的角色。
我可以参考 HttpContext
。但是 HttpContext.Request.RouteValues
似乎无法访问。
有人知道吗? 我的代码:
public class RoleHandler :
AuthorizationHandler<RoleRequirement>
{
private readonly IUnitOfWork _context;
private readonly IHttpContextAccessor _httpContext;
public RoleHandler(IHttpContextAccessor httpContext, IUnitOfWork context)
{
_context = context;
_httpContext = httpContext;
}
protected override Task HandleRequirementAsync(
AuthorizationHandlerContext authorizationcontext,
RoleRequirement requirement)
{
var roleClaim = authorizationcontext.User.Claims
.Where(c =>
c.Type == ClaimTypes.Role);
var routeData = authorizationcontext.Resource ;
if (ThisRoleIsAllowed(roleClaim, requirement.ActionName).Result)
authorizationcontext.Succeed(requirement);
return Task.CompletedTask;
}
让我在这里总结一下我们到目前为止讨论的内容。 (我的目的是从评论中捕捉有价值的信息)。
OP 想要实现基于授权 的资源(端点)。 (ASP.NET 核心标准是基于角色的。)为此,需要以下信息:
- 已解析的控制器和动作名称(已解析表示基于路由 table,哪个控制器的哪个动作应处理特定请求)
基于这些和角色声明,授权逻辑可以轻松决定是否允许请求者访问资源。
为了能够检索控制器的名称和操作的名称,我建议如下:
- 在
HttpContext
上调用 - 在
Endpoint
上调用 - 在
ControllerActionDescriptor
(1) 上访问
GetEndPoint
extension method
GetMetadata<ControllerActionDescriptor>
ControllerName
和 ActionName
所以,总结一下:
public class RoleHandler: AuthorizationHandler<RoleRequirement>
{
private readonly IHttpContextAccessor _httpContextAccessor;
protected override Task HandleRequirementAsync
(AuthorizationHandlerContext authorizationcontext, RoleRequirement requirement)
{
var endpoint = _httpContextAccessor.HttpContext.GetEndpoint();
var descriptor = endpoint.Metadata.GetMetadata<ControllerActionDescriptor>();
var controllerName = descriptor.ControllerName;
//...
}
}