1

請幫我決定如何爲我的項目授權。ASP.Net MVC聲明授權和認證

該項目是用ASP.Net MVC編寫的,它是一個允許用戶通過Active Directory登錄的Intranet應用程序。

用戶可以是Junior Lecturer,高級講師,HOD或超級用戶。這對於角色來說很簡單,但情況比這更復雜,因爲這些角色基於您正在查看的任何信息。例如,一名初級講師只能看到他講課的學生的信息。

據我所知,這是聲稱來的地方。我應該爲學生分配模塊或學生。

但是,這個過程如果進一步複雜化,因爲在任何一個地方沒有AD用戶名和他們的學生/模塊列表。

我需要能夠檢查幾個數據庫,看看是否應該允許用戶查看信息。

有時候,有權查看特定信息的用戶不會通過任何這些檢查。因此,我將不得不用AD用戶名,他們的角色和他們的學科/學生創建一個數據庫。

所以我的問題是關於授權。我是否可以對索賠擁有這種程度的控制權,以及如何分配和檢查索賠?

如果它不可能 - 我該如何做這個授權?

在每個控制器的每個動作開始時都有一個if語句,這感覺是錯誤的 - 但這就是我所有的同事都可以想到的。

+1

我確實設法解決一個問題,近一點你最近有什麼。我仍然在撰寫博客文章,但[這](http://blog.dinklabs.com/2015/11/mvc-fine-grained-identity-access-control-1.html)是我的方法。 –

回答

1

如果您創建一個繼承自AuthorizeAttribute的類,那麼您可以自由地執行任何您認爲合適的複雜授權過程。請參閱我的回答here瞭解如何操作。

下面是一些代碼,我使用的查詢和緩存AD角色:

private static Dictionary<Tuple<string, string>, bool> groupIdentityCache = new Dictionary<Tuple<string, string>, bool>(); 

..

public static bool UserHasRole(IIdentity identity, string groupShortName)  
{ 
    // (we rename our actual AD roles to shorter ones relevant to the site 
    // e.g. [MyAuthorizeAttribute(Roles = "Support,Admin")]) 
    if (!AdLongGroupNames.ContainsKey(groupShortName.ToUpper())) return false; 
    string fullADGroupName = AdLongGroupNames[groupShortName.ToUpper()];    
    Tuple<string, string> key = new Tuple<string, string>(identity.Name.ToUpper(), groupShortName.ToUpper()); 
    if (!groupIdentityCache.ContainsKey(key)) 
    { 
     using (PrincipalContext principalContext = new PrincipalContext(ContextType.Domain, "DOMAINNAME"))  
     { 
      using (GroupPrincipal groupPrincipal = GroupPrincipal.FindByIdentity(principalContext, fullADGroupName)) 
      { 
       using (UserPrincipal userPrincipal = UserPrincipal.FindByIdentity(principalContext, GetLogin(identity))) 
       { 
        groupIdentityCache[key] = userPrincipal.IsMemberOf(groupPrincipal); 
       } 
      } 
     }     
    }    
    return groupIdentityCache[key]; 
} 

public static string GetLogin(IIdentity identity) 
{ 
    string[] parts = identity.Name.Split('\\'); 
    if (parts.Count() < 2) return parts[0]; else return parts[1]; 
} 

如果您緩存角色成員身份,則還必須清除Session_Start上的緩存以使更改生效。

通過添加到groupIdentityCache字典中,您可以修改此解決方案以包含來自非AD源的角色(例如類成員的數據庫等)。修改groupIdentityCache也可以在測試時提供幫助。

0

有一個'if'語句是錯誤的,它會花費你長時間的迭代和巨大的內存濫用。

基本上,您幾乎可以使用authorize屬性來控制每個級別的授權。

但是,您確實需要一個精心打造的實體才能這樣做,以便不會因爲所有規則而迷失方向。建議您在提交之前對您的授權方案有適當的計劃。

您可以嘗試使用switch語句,這在實踐中會更好。

請注意:

Authorization Article,可以幫助你理解。

+0

我應該在哪裏使用switch語句?感謝這篇文章 - 問題是雖然這些活動不是我遇到的問題。事實上,我真正需要的唯一活動就是閱讀。問題是,該用戶是否可以訪問此模塊?我應該在哪裏放置檢查代碼? – abiNerd