【发布时间】:2017-12-14 09:00:59
【问题描述】:
如何访问当前 HttpContext 以检查 ASP.NET Core 2 中基于自定义策略的授权的 AuthorizationHandlerContext 中的路由和参数?
【问题讨论】:
标签: c# asp.net-core .net-core asp.net-core-2.0
如何访问当前 HttpContext 以检查 ASP.NET Core 2 中基于自定义策略的授权的 AuthorizationHandlerContext 中的路由和参数?
【问题讨论】:
标签: c# asp.net-core .net-core asp.net-core-2.0
您应该将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();
【讨论】:
IActionContextAccessor)。您可能需要做一些与这篇文章中详述的内容类似的事情 - How to get params from AuthrizationHandler .net core。这个答案的作者是微软的 ASP.NET 安全人员,所以很权威。自从这篇文章以来,事情是否已经发生了变化,我无法确定。注意:我已经更新了我的帖子,详细介绍了 DI 注册(可能需要)。
您可以将IHttpContextAccessor 注入到您的AuthorizationHandlers 构造函数中。
例如
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
}
}
【讨论】:
无需注入,简单的解决方案!
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'.'
如果是 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.
}
在 .NET 5 中,您可以使用以下代码:
if(context.Resource.GetType().FullName == "Microsoft.AspNetCore.Http.DefaultHttpContext")
{
var httpContext = context.Resource as Microsoft.AspNetCore.Http.DefaultHttpContext;
}
【讨论】: