2014-09-23 39 views
7

有沒有人有任何關於強制記錄級授權,同時保持ASP.Net MVC網站內的關注點分離的好方法的建議?MVC/ASP.Net記錄級授權的最佳實踐

用的PrincipalPermission,您可以裝飾的方法有:

PrincipalPermission(SecurityAction.Demand, Role = "GroupLeader") 

要求對任何遊客到該頁面是固定的作用「GroupLeader」中的一員。

或者,你可以裝飾用的方法:

[ClaimsPrincipalPermission(SecurityAction.Demand, Operation = "Manage", Resource = "Group")] 

要求對任何遊客到該頁面被允許一般管理一組。

但是,這些都不能解決用戶可能有權編輯某些組的情況,而不是其他情況。據我所知,即使我實現了自定義ClaimsAuthorizationManager,也無法訪問方法參數以執行條件授權。

此外,上述兩種方法只是拋出一個SecurityException如果用戶沒有訪問,而不是允許的方法向用戶正常重定向到解釋發生了什麼,他們可能會做,以獲得必要的授權什麼頁面。很明顯,我也意識到我可以將授權邏輯編碼到方法本身並進行相應的重定向,但我寧願將其分開,並儘可能保持方法代碼的清潔,以便僅處理實際處理請求,並且還處理能夠在一個更通用的框架內工作。

那麼,是否有一個「開箱即用」的方式來處理這種情況,或者我必須實現一個自定義的IAuthorizationFilter?我認爲我可以處理記錄級別的授權和優雅的重定向,但是在方法級別沒有任何參數,它本質上將是一個龐大的if ... else if聲明。

+0

沒有什麼開箱即可,但你不應該需要一個巨大的'如果其他'。在授權過濾器中,您自己有請求,所以您可以從那裏獲取內容。 – Shoe 2014-09-23 15:23:15

+0

你真的問的問題是「我可以在_this_對象上執行操作嗎?」實際上我正在做一些與此相關的搜索,但我還沒有遇到一個好的解決方案。基本上,你想[自主訪問控制](http://en.wikipedia.org/wiki/Discretionary_access_control)。維基百科描述了它,但我還沒有找到具體的編程模式。「自主訪問控制」就像是答案,但我需要更多的研究,因爲它主要關注系統資源(例如文件系統或計算機)。 – 2014-09-23 16:41:08

回答

1

處理這種情況最直接的方法是在您的實體上創建一個屬性,以存儲實體的「所有者」或「創建者」。然後,當您查詢對象時,按此過濾。例如:

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); 
} 

這不是真的適合通過授權過濾器,因爲你必須選擇該行,以確定用戶的權限來處理這個問題。然後,您必須在動作中再次選擇行以將其發送到視圖。此外,你必須做一些雜技,讓過濾器能夠知道它應該從哪裏選擇什麼,以便你甚至可以首先檢查權限。在這個動作中,你已經選擇了實體,所以只要根據用戶是否同時「擁有」來調整它。