C# 如何在AuthorizationHandler中获取控制器和操作?

C# 如何在AuthorizationHandler中获取控制器和操作?,c#,core,identity,httpcontext,asp.net-core-3.1,C#,Core,Identity,Httpcontext,Asp.net Core 3.1,我只是想知道是否可以在授权处理程序中获取控制器和操作?!为了能够根据请求的操作验证用户的角色,需要使用它 我能够获得对HttpContext的引用。但是HttpContext.Request.routeValue似乎无法访问 有人知道吗? 我的代码: 公共类角色管理器: 授权处理程序 { 私有只读IUnitOfWork\u上下文; 专用只读IHttpContextAccessor\u httpContext; 公共角色句柄(IHttpContextAccessor httpContext、IUn

我只是想知道是否可以在
授权处理程序中获取
控制器
操作
?!为了能够根据请求的操作验证用户的角色,需要使用它

我能够获得对
HttpContext
的引用。但是
HttpContext.Request.routeValue似乎无法访问

有人知道吗? 我的代码:

公共类角色管理器:
授权处理程序
{
私有只读IUnitOfWork\u上下文;
专用只读IHttpContextAccessor\u httpContext;
公共角色句柄(IHttpContextAccessor httpContext、IUnitOfWork上下文)
{
_上下文=上下文;
_httpContext=httpContext;
}
受保护的覆盖任务句柄请求同步(
AuthorizationHandlerContext authorizationcontext,
角色(要求)
{
var roleClaim=authorizationcontext.User.Claims
.其中(c=>
c、 类型==ClaimTypes.Role);
var routeData=authorizationcontext.Resource;
if(ThisRoleIsAllowed(roleClaim,requirement.ActionName).Result)
授权上下文。成功(要求);
返回Task.CompletedTask;
}

让我在这里总结一下我们到目前为止讨论的内容。 (我的目的是从评论中获取有价值的信息)

OP希望实现基于资源(端点)的授权(ASP.NET核心标准是基于角色的)。为此,需要以下信息:

  • 解析的控制器和操作名称(解析的意思是基于路由表,哪个控制器的哪个操作应该处理特定请求)
基于这些和角色声明,授权逻辑可以轻松决定是否允许请求者访问资源


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

  • HttpContext
  • 调用
    端点上的
    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;

         //...
    }
}
公共类RoleHandler:AuthorizationHandler
{
专用只读IHttpContextAccessor\u httpContextAccessor;
受保护的覆盖任务句柄请求同步
(授权HandlerContext授权Context角色需求要求)
{
var endpoint=httpContextAccessor.HttpContext.GetEndpoint();
var descriptor=endpoint.Metadata.GetMetadata();
var controllerName=descriptor.controllerName;
//...
}
}

请与我们分享您的
AuthorizationHandler
实现。我分享代码@petercsala
authorizationcontext.Resource
的具体类型是什么?是吗?显然是object@amihejazi.是的,它确实是一个对象。但它被用作通用容器。因此,如果调用
.GetType().Name
.GetType().FullName
将返回包装对象的类型。我想为面临相同问题的任何人添加一件事。我在我的基础结构层中添加RoleHandler,这会在将其移动到api层后导致问题。特别感谢@Peter Csala,问题会消失
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;

         //...
    }
}