在早期版本的ASP.NET Core中,可以通過重寫bool AuthorizeCore(HttpContextBase httpContext)
來創建自定義AuthorizeAttribute
。然而,此方法在AuthorizeAttribute
中已不再存在。
當前創建自定義AuthorizeAttribute
的方法是使用新的策略設計,其文檔此處。這種新方法的基本思想是使用新的[Authorize]
特性來指定一個“策略”(例如[Authorize(Policy = "YouNeedToBe18ToDoThis")]
),該策略在應用程序的Startup.cs
中註冊,以執行某些代碼塊(即確保用戶擁有一個年齡聲明,其中年齡為18歲或以上)。
策略設計是對框架的一個很好的補充,ASP.Net安全核心團隊應該為此表示讚揚。也就是說,它並不適用於所有情況。這種方法的缺點是它未能為最常見的需求提供便捷的解決方案:簡單地斷言給定的控制器或操作需要給定的聲明類型。如果應用程序可能有數百個離散的權限來管理單個REST資源上的CRUD操作(“CanCreateOrder”、“CanReadOrder”、“CanUpdateOrder”、“CanDeleteOrder”等),則新方法要么需要在策略名稱和聲明名稱之間進行重複的一對一映射(例如options.AddPolicy("CanUpdateOrder", policy => policy.RequireClaim(MyClaimTypes.Permission, "CanUpdateOrder"));
),要么編寫一些代碼在運行時執行這些註冊(例如,從數據庫讀取所有聲明類型並在循環中執行上述調用)。對於大多數情況而言,這種方法的問題在於它是多餘的開銷。
雖然ASP.Net Core安全團隊建議不要創建您自己的解決方案,但在某些情況下,這可能是最謹慎的起始選項。
以下是使用IAuthorizationFilter
的實現,它提供了一種簡單的方法來表達給定控制器或操作的聲明需求:
<code class="language-csharp">public class ClaimRequirementAttribute : TypeFilterAttribute { public ClaimRequirementAttribute(string claimType, string claimValue) : base(typeof(ClaimRequirementFilter)) { Arguments = new object[] { new Claim(claimType, claimValue) }; } } public class ClaimRequirementFilter : IAuthorizationFilter { readonly Claim _claim; public ClaimRequirementFilter(Claim claim) { _claim = claim; } public void OnAuthorization(AuthorizationFilterContext context) { var hasClaim = context.HttpContext.User.Claims.Any(c => c.Type == _claim.Type && c.Value == _claim.Value); if (!hasClaim) { context.Result = new ForbidResult(); } } } [Route("api/resource")] public class MyController : Controller { [ClaimRequirement(MyClaimTypes.Permission, "CanReadResource")] [HttpGet] public IActionResult GetResource() { return Ok(); } }</code>
以上是如何在ASP.NET Core中創建自定義授權材料以滿足簡單索賠要求?的詳細內容。更多資訊請關注PHP中文網其他相關文章!