[英]How to access current HttpContext in ASP.NET Core 2 Custom Policy-Based Authorization with AuthorizationHandlerContext
如何訪問當前 HttpContext 以檢查 ASP.NET Core 2 內基於策略的自定義授權的 AuthorizationHandlerContext 內的路由和參數?
參考示例: 基於策略的自定義授權
您應該將IHttpContextAccessor的實例注入到AuthorizationHandler
。
在您的示例的上下文中,這可能類似於以下內容:
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();
您可以將IHttpContextAccessor
注入到AuthorizationHandler
的構造函數中。
例如
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
}
}
如果它是 MVC 上下文,您可以從AuthorizationContext context
訪問HttpContext
、 RouteData
和 MVC 提供的所有其他內容:
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;
}
無需注射,簡單的解決方案!
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, MyRequirement requirement)
{
var authFilterCtx = (Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext)context.Resource;
var httpContext = authFilterCtx.HttpContext;
}
這是來自微軟文檔(ASP.NET Core 6):
HandleRequirementAsync
方法有兩個參數:一個AuthorizationHandlerContext
和正在處理的TRequirement
。 MVC 或 SignalR 等框架可以自由地將任何 object 添加到AuthorizationHandlerContext
上的 Resource 屬性以傳遞額外信息。
使用端點路由時,授權通常由授權中間件處理。 在這種情況下, Resource
屬性是 HttpContext 的一個實例。 上下文可用於訪問當前端點,該端點可用於探測您要路由到的底層資源。 例如:
if (context.Resource is HttpContext httpContext)
{
var endpoint = httpContext.GetEndpoint();
var actionDescriptor = endpoint.Metadata.GetMetadata<ControllerActionDescriptor>();
...
}
正如其他人所提到的,注入IHttpContextAccessor
是訪問HttpContext
的另一種方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.