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
实现。我分享代码@petercsalaauthorizationcontext.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;
//...
}
}