[英]MVC / ASP.Net Best Practice for Record-Level Authorization
在ASP.Net MVC網站內保持關注點分離的同時,是否有人對執行記錄級授權的良好方法有任何建議?
使用PrincipalPermission,您可以使用以下方法修飾方法:
PrincipalPermission(SecurityAction.Demand, Role = "GroupLeader")
要求該頁面的任何訪問者都是固定角色“GroupLeader”的成員。
或者,您可以使用以下方法修飾方法:
[ClaimsPrincipalPermission(SecurityAction.Demand, Operation = "Manage", Resource = "Group")]
要求允許該頁面的任何訪問者一般地管理一個組。
但是,這些都不能真正解決用戶可能擁有編輯某些組的權限的情況,而不能解決其他組的情況。 據我所知,即使我實現了自定義ClaimsAuthorizationManager
,也無法訪問方法參數以進行條件授權。
此外,如果用戶沒有訪問權限,而不是允許方法將用戶正常地重定向到解釋發生了什么以及他們可能做什么以獲得必要授權的頁面,則上述兩種方法都會拋出SecurityException
。
顯然,我也意識到我只能將授權邏輯編碼到方法本身並相應地重定向,但我寧願將其分開,如果可能的話,並保持方法代碼干凈,只處理實際處理請求,並且能夠在可以更一般地應用的框架內工作。
那么,是否有一種“開箱即用”的方式來處理這種情況,或者我是否必須實現自定義的IAuthorizationFilter
? 我想我可以處理記錄級授權和優雅重定向,但是在方法級別沒有任何參數,它本質上是一個巨大的if ... else if
語句。
處理這種情況最直接的方法是在您的實體上創建一個屬性來存儲實體的“所有者”或“創建者”。 然后,當您查詢對象時,您將按此過濾。 例如:
public class Foo
{
public int Id { get; set; }
...
public string Creator { get; set; }
}
然后:
public ActionResult FooDetails(int id)
{
var foo = db.Foos.SingleOrDefault(m => m.Id == id && m.Creator == User.Identity.Name);
if (foo == null)
{
return new HttpNotFoundResult();
}
return View(foo);
}
通過授權過濾器處理此問題並不合適,因為您必須選擇行來確定用戶的權限。 然后,您必須在操作中再次選擇該行以將其發送到視圖。 此外,你必須做一些雜技,以使過濾器能夠知道它應該從哪里選擇,以便你甚至可以首先檢查權限。 在操作中,您已經在選擇實體,因此只需根據用戶是否“同時擁有”它來對其進行調整。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.