2017-02-12 79 views
0

大多數文章/例子我發現就涉及限制訪問使用角色特定的控制器,用於asp.net的MVC的訪問權限,但我試圖找出如何具體訪問權限被分配給屬於特定角色的用戶。分配訪問權限,角色在asp.net mvc的

我的情況是相當簡單的,因爲這需要在用戶級別的訪問權限是「職工」角色的唯一角色:

  • 管理員:訪問所有功能。
  • 工作人員:訪問特定功能。
  • 成員:無法訪問特定功能。

理想情況下,我想實現類似於下面

@if (@User.IsInRole("IsAdmin") || (@User.IsInRole("IsStaff") && 
    @User.HasAccess("DownloadData")) 
{ 
    <a href='@Url.Action("DownloadData".... 
    </a>  
} 

我有一個單獨的表在哪裏存放員工的訪問權限,並因爲這些在用戶級別分配的東西,我使用的AspNetUsers產生相同Id這麼一個簡單的EF/SQL LINQ的加入的確,當我登錄到獲得特定工作人員的有關訪問權限的伎倆。

現在我的問題是:

  1. 我可以展開@user(校長)通過引入新的功能,例如有類似於上述的場景具有HasAccess在那裏我可以通過訪問權限需要檢查具體工作人員。

  2. 1.如果不能完成,將通過右視圖模型用於構建我的網頁是一個可行的選擇登錄的用戶訪問?這太危險了嗎?我錯了,以爲這應該是好的,因爲這是基於服務器的代碼,並不會傳遞到客戶端?

  3. 如果1 & 2是不適合的,什麼是最好的/推薦的方法來實現這一目標?

感謝

回答

0

最簡單的方法是對IPrincipalIClaimsPrincipal創建一個擴展方法。這樣您就可以將訪問權定義統一在一個地方。如果您有很多訪問權限檢查,也許您需要將權限添加爲聲明(如果您使用聲明)或以某種方式緩存它們,以便您不需要每次都訪問數據庫(如果它們存儲在數據庫中) 。

而且,你是對的,這是相同的,如果你傳遞的訪問權限的視圖,因爲視圖渲染到HTML。但是,恕我直言,第一個選擇是好得多,因爲你不需要通過訪問權限檢查混亂你的控制器。

+0

好吧,我會去研究選項1,看看有什麼可以做的。如果你有任何興趣的鏈接,你會介意發佈它們。 – Thierry

+0

我在SO上發現了這個問題,並且很好地解釋瞭如何擴展IPrincipal,但我仍然不確定如何使用它。我是否通過ApplicationUser替換ApplicationUser:IdentityUser:UserPrincipal其中UserPrincipal從IPrincipal繼承? – Thierry

+0

在較新版本的ASP.NET MVC中,您不需要在使用聲明時擴展Principal。您只需將您的訪問權限添加爲新的聲明。另外,爲了添加函數來檢查訪問權限,也許這足以創建一個擴展方法,而不是使用繼承。 –

相關問題