繁体   English   中英

如何在 AuthorizationHandler 中获取 Controller 和 Action?

[英]How to get Controller and Action inside AuthorizationHandler?

我只是想知道是否有可能在AuthorizationHandler中获得ControllerAction 需要它才能根据请求的操作验证用户的角色。

我可以参考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 核心标准是基于角色的。)为此,需要以下信息:

  • 解析的 controller 和动作名称(解析的意思是基于路由表,哪个控制器的哪个动作应该处理特定的请求)

基于这些和角色声明,授权逻辑可以轻松地决定是否允许请求者访问资源。


为了能够检索控制器的名称和操作的名称,我建议如下:

  • HttpContext上调用GetEndPoint 扩展方法
  • Endpoint上调用GetMetadata<ControllerActionDescriptor>
  • 访问ControllerActionDescriptor上的ControllerNameActionName ( 1 )

所以,总结一下:

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;

         //...
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM