簡體   English   中英

ASP.Net MVC要求授權和身份驗證

[英]ASP.Net MVC claims authorization and authentication

請幫助我決定如何為我的項目做授權。

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

用戶可以是初級講師,高級講師,HOD或超級用戶。 使用角色很容易,但是情況要復雜得多,因為這些角色基於您正在查看的任何信息。 例如,初級講師只能看到他講課的學生的信息等。

據我了解,這就是索賠的來源。我應該為用戶分配模塊或學生。

但是該過程更加復雜,因為在任何地方都沒有AD用戶名及其學生/模塊的列表。

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

但是有時,有權查看某些信息的用戶將不會通過任何這些檢查。 因此,我將不得不創建一個具有AD用戶名,他們的角色以及他們的科目/學生的數據庫。

所以我的問題真的是關於授權。 我是否可以對索賠有這樣的控制權,我將如何分配它們並對其進行檢查?

如果不可能-我將如何進行此授權?

在每個Controller的每個Action開頭都有一個if語句感覺很不對-但這就是我所有同事所能想到的。

如果您創建一個從AuthorizeAttribute繼承的類,那么您可以自由地執行您認為合適的任何復雜授權過程。 在此查看我的答案。

這是我用來查詢和緩存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還可在測試時提供幫助。

如果使用“ if”語句是錯誤的,則將花費較長的迭代時間,並且會嚴重浪費內存。

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

但是,您確實需要一個結構良好的實體來這樣做,以免丟失所有規則。 強烈建議您在提交此授權計划之前,為您的授權計划制定適當的計划。

您可以嘗試改用switch語句,這在實踐中會好很多。

請注意:

授權文章 ,可能會幫助您理解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM