如何使用 AuthorizationHandlerContext 在 ASP.NET Core 2 自定义基于策略的授权中访问当前的 HttpContext
Posted
技术标签:
【中文标题】如何使用 AuthorizationHandlerContext 在 ASP.NET Core 2 自定义基于策略的授权中访问当前的 HttpContext【英文标题】:How to access current HttpContext in ASP.NET Core 2 Custom Policy-Based Authorization with AuthorizationHandlerContext 【发布时间】:2017-12-14 09:00:59 【问题描述】:如何访问当前 HttpContext 以检查 ASP.NET Core 2 中基于自定义策略的授权的 AuthorizationHandlerContext 中的路由和参数?
参考示例:Custom Policy-Based Authorization
【问题讨论】:
【参考方案1】:您应该将IHttpContextAccessor 的实例注入您的AuthorizationHandler
。
在您的 example 的上下文中,这可能如下所示:
public class BadgeEntryHandler : AuthorizationHandler<EnterBuildingRequirement>
IHttpContextAccessor _httpContextAccessor = null;
public BadgeEntryHandler(IHttpContextAccessor httpContextAccessor)
_httpContextAccessor = httpContextAccessor;
protected override Task HandleRequirementAsync(
AuthorizationContext context,
EnterBuildingRequirement requirement)
HttpContext httpContext = _httpContextAccessor.HttpContext; // Access context here
if (context.User.HasClaim(c => c.Type == ClaimTypes.BadgeId &&
c.Issuer == "http://microsoftsecurity"))
context.Succeed(requirement);
return Task.FromResult(0);
您可能需要在您的 DI 设置中注册它(如果您的依赖项之一尚未注册),如下所示:
services.AddHttpContextAccessor();
【讨论】:
好的,什么是提取 HTTP GET 参数(从路由,如 route="/api/customers/customerGuid" )而不从 HttpContext 手动解析字符串路径的最佳方法?发送 @HrvojeKusulja:参数值在这个阶段没有被绑定(即使是IActionContextAccessor
)。您可能需要做一些与这篇文章中详述的内容类似的事情 - How to get params from AuthrizationHandler .net core。这个答案的作者是微软的 ASP.NET 安全人员,所以很权威。自从这篇文章以来,事情是否已经发生了变化,我无法确定。注意:我已经更新了我的帖子,详细介绍了 DI 注册(可能需要)。【参考方案2】:
您可以将IHttpContextAccessor
注入到您的AuthorizationHandler
s 构造函数中。
例如
public class MyAuthorizationHandler : AuthorizationHandler<MyRequirement>
private IHttpContextAccessor _contextAccessor;
public MyAuthorizationHandler (IHttpContextAccessor contextAccessor)
_contextAccessor = contextAccessor;
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
MinimumPermissionLevelRequirement requirement)
var httpContext = _contextAccessor.HttpContext;
// do things
【讨论】:
【参考方案3】:无需注入,简单的解决方案!
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, MyRequirement requirement)
var authFilterCtx = (Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext)context.Resource;
var httpContext = authFilterCtx.HttpContext;
【讨论】:
它对我不起作用。System.InvalidCastException: 'Unable to cast object of type 'Microsoft.AspNetCore.Routing.RouteEndpoint' to type 'Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext'.'
你找到netcoreapp3.0的有效解决方案了吗?【参考方案4】:
如果是 MVC 上下文,您可以访问 HttpContext
、RouteData
以及 MVC 从 AuthorizationContext context
提供的所有其他内容:
var mvcContext = context.Resource as Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext;
if (mvcContext != null)
// Examine MVC specific things like routing data.
https://jakeydocs.readthedocs.io/en/latest/security/authorization/policies.html#accessing-mvc-request-context-in-handlers
在 .NET 5 中,您可以使用以下代码:
if(context.Resource.GetType().FullName == "Microsoft.AspNetCore.Http.DefaultHttpContext")
var httpContext = context.Resource as Microsoft.AspNetCore.Http.DefaultHttpContext;
【讨论】:
以上是关于如何使用 AuthorizationHandlerContext 在 ASP.NET Core 2 自定义基于策略的授权中访问当前的 HttpContext的主要内容,如果未能解决你的问题,请参考以下文章
AuthorizationHandler异常不通过ExceptionFilter
自定义AuthorizationHandler HandleRequirementAsync未调用
有没有办法在 .Net 5 中的 AuthorizationHandler 中重定向?