我有一個帶有一堆控制器和操作的 ASP.NET Web API。通過使用EndpointDataSource,我可以獲得 API 中所有端點的串列,在啟動期間用于維護控制器和操作表。我將這些記錄鏈接到一個角色表,這樣我就可以在不更改代碼的情況下將角色管理到特定的操作和控制器。這將允許管理員創建提供對這些控制器和操作的訪問權限的自定義角色。API 已經有一個自定義身份驗證機制,用戶被分配到不同的角色,所以我不能使用“標準”解決方案進行角色管理。(登錄程序有點復雜。)
所以我想創建一個類屬性[ClassRole]和一個方法屬性[ActionRole]附加到需要通過角色管理的任何操作。所以我有這個代碼:[AttributeUsage(AttributeTargets.Class)]
public class ControllerRoleAttribute : Attribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
}
}
[AttributeUsage(AttributeTargets.Method)]
public class ActionRoleAttribute : Attribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationFilterContext context)
{
}
}
而這些方法需要做一些事情。基本上,在資料庫中查找控制器名稱或操作名稱很容易。但是如何從這個AuthorizationFilterContext類中獲取控制器名稱和動作名稱呢?最好不必決議 URL 或其他任何東西。
僅供參考:ActionRoleAttribute將首先通過控制器驗證角色,然后再通過操作進行驗證。
在這兩種情況下,當驗證失敗時,將引發自定義例外并記錄其他資料。這也是我需要單獨解決方案的原因。此外,如果當前用戶具有AdminorSuperAdmin狀態,則不會檢查角色,但會自動授予訪問權限。
這個 API 有很多控制器,每個控制器只有幾個動作。每個控制器都是處理相關動作的邏輯單元。這些操作中的大多數都涉及資料管理,并且往往是敏感資訊。這有點復雜,因為用戶管理本身也有點復雜,因為用戶分為組和子組,并且可以將角色分配給特定用戶、組或子組。管理員只控制他們自己的組和子組,而超級管理員是我。我應該什么都能做。
最重要的是獲取控制器名稱!
uj5u.com熱心網友回復:
該類AuthorizationFilterContext有一個名為的屬性ActionDescriptor,它包含您需要的詳細資訊。但是,它使用特定于控制器的派生類,因此您需要將其轉換為ControllerActionDescriptor獲取相關詳細資訊。所以你可以做這樣的事情:
public void OnAuthorization(AuthorizationFilterContext context)
{
if (context.ActionDescriptor is
ControllerActionDescriptor controllerActionDescriptor)
{
var actionName = controllerActionDescriptor.ActionName;
var controllerName = controllerActionDescriptor.ControllerName;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/447258.html
標籤:C# asp.net 核心 asp.net-web-api 路线
