我正在嘗試在 .NET Core 6 中配置自定義授權策略,在處理程式中使用以下邏輯:
- 獲取用戶嘗試訪問的控制器名稱和獲取控制器操作
- 如果 Claim.Type = Controller Name 和 Value = Controller Action,則授予訪問權限。
我正在嘗試使用注入處理程式類的 IHttpContextAccessor 訪問控制器名稱和操作。如何獲取控制器名稱和操作方法名稱?我發現有幾篇文章提到了如何在以前版本的 .NET Core 中執行此操作。但那些在 .NET 6 上不起作用。它總是提供 NULL 值
當前 AccessHandler(.NET 的早期版本)
using Microsoft.AspNetCore.Authorization;
namespace myApp.Security
{
public class AccessHandler : AuthorizationHandler<AccessRequirement>
{
private readonly IHttpContextAccessor httpContextAccessor;
public AccessHandler(IHttpContextAccessor httpContextAccessor)
{
this.httpContextAccessor = httpContextAccessor ?? throw new ArgumentNullException(nameof(httpContextAccessor));
}
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, AccessRequirement requirement)
{
string? controllerName = httpContextAccessor.HttpContext?.Request.Query["controller"].ToString();
string? actionName = httpContextAccessor.HttpContext?.Request.Query["action"].ToString();
if (controllerName != null && actionName != null)
{
if (context.User.HasClaim(claim => claim.Type == controllerName && claim.Value == actionName))
{
context.Succeed(requirement);
}
}
return Task.CompletedTask;
}
}
}
uj5u.com熱心網友回復:
終于找到了解決辦法,找的程序真的很滿意。下面介紹了如何在 .NET 6 Core 中執行此操作。修改需求處理程式如下:
using Microsoft.AspNetCore.Authorization;
namespace myApp.Security
{
public class AccessHandler : AuthorizationHandler<AccessRequirement>
{
private readonly IHttpContextAccessor httpContextAccessor;
public AccessHandler(IHttpContextAccessor httpContextAccessor)
{
this.httpContextAccessor = httpContextAccessor ?? throw new ArgumentNullException(nameof(httpContextAccessor));
}
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, AccessRequirement requirement)
{
string? controllerName = httpContextAccessor.HttpContext?.Request.RouteValues["controller"]?.ToString();
string? actionName = httpContextAccessor.HttpContext?.Request.RouteValues["action"]?.ToString();
if (controllerName != null && actionName != null)
{
if (context.User.HasClaim(claim => (claim.Type == controllerName && claim.Value == actionName)))
{
context.Succeed(requirement);
}
}
return Task.CompletedTask;
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/394411.html
標籤:C# asp.net核心 .net核心 asp.net-core-mvc .net-6.0
