2013-04-01 68 views
1

我有一個使用本機身份驗證控件的.NET Framework第4版在Visual Studio 2010中開發的ASP.NET應用程序。我使用Active Directory成員資格提供程序連接了該站點。由ASP.NET中的AD安全組篩選

我的連接字符串看起來是這樣的:

connectionString="LDAP://MYDC-004/DC=company,DC=corp,DC=pvt" 

這工作得很好,作爲登錄頁面正常工作,而且存在於公元任何用戶都可以使用自己的憑據登錄。

不過,我希望允許在一個特定安全組用戶能夠登錄。我知道那裏的安全組(稱爲「GR-DwgDep-管理員」)位於在AD組織單位,所以我想出了這個修改的連接字符串:

connectionString="LDAP://MYDC-004/CN=GR-DwgDep-Admins,OU=Groups,OU=Division,DC=company,DC=corp,DC=pvt" /> 

當我嘗試登錄(和我肯定是這個組中),我得到的錯誤是「用戶對象不能創建指定的容器「。

我的語法不正確嗎?或者我在概念上以錯誤的方式做這件事?我真的更喜歡通過連接字符串設置來完成此操作,因爲這樣現有的.NET登錄控件將按原樣工作。

我將不勝感激任何人有任何建議。謝謝!

回答

1

您還需要遍歷用戶所屬的組,並檢查它是否與您想要授予訪問權限的組相匹配。

首先你需要加載用戶,然後你需要遍歷「memberOf」集合並檢查它們是否屬於指定的組。

  //Get connectionstring from web.config and initialize directory entry to search for groups user belongs to 
      DirectoryEntry de = new DirectoryEntry(ConfigurationManager.ConnectionStrings["ADConnectionString"].ConnectionString); 

      //Specify that we want to find the groups 
      DirectorySearcher ds = new DirectorySearcher(de, "(objectCategory=group)"); 

      //Filter by user and specify what data to return 
      ds.Filter = String.Format("(&(SAMAccountName={0}))", model.UserName); 
      ds.PropertiesToLoad.Add("sAMAccountName"); 
      ds.PropertiesToLoad.Add("memberOf"); 

      //Loop though all results 
      foreach (SearchResult sr in ds.FindAll()) 
      { 
       //Get the properties available and loop through "memberof" 
       DirectoryEntry desr = sr.GetDirectoryEntry(); 
       ResultPropertyCollection myResultPropColl = sr.Properties; 

       //Get a key 
       foreach (string myKey in myResultPropColl.PropertyNames) 
       { 
        //Check the key that we are using "memberof" 
        if (myKey.ToLower() == "memberof") 
        { 
         //Loop through all items for given key 
         foreach (System.String myCollection in myResultPropColl[myKey]) 
         { 
          //Check if we have a match 
          if (myCollection.Contains("Web - Internal Admin")) 
          { 
           //Success         

           de.Dispose(); 
           desr.Dispose(); 
           //Do something 
          } 
         } 
        } 
       } 
      } 

對於第一線,我從我的web.config讓我的AD連接​​字符串

ConfigurationManager.ConnectionStrings["ADConnectionString"].ConnectionString 

的web.config

<add name="ADConnectionString" connectionString="LDAP://ua.local/DC=ua,DC=local" /> 

然後我得到的組和過濾它通過特定用戶名。然後我指定sAMAccountName和memberOf的返回值。在這個例子中,取得sAMAccountName並不是祕密。

DirectorySearcher ds = new DirectorySearcher(de, "(objectCategory=group)"); 

     //Filter by user and specify what data to return 
     ds.Filter = String.Format("(&(SAMAccountName={0}))", model.UserName); 
     ds.PropertiesToLoad.Add("sAMAccountName"); 
     ds.PropertiesToLoad.Add("memberOf"); 

其餘的幾乎是直截了當的理解。循環查看結果並檢查「memberof」鍵。一旦找到,請使用「memberof」鍵並遍歷其值,並檢查它是否與您要求的組匹配。

if (myKey.ToLower() == "memberof") 

檢查這個鏈接,瞭解更多信息: Searching for groups

+0

雷米 - 最後我做類似的事情,但我喜歡你的方法好。我會試驗你在這裏做了什麼,並回過頭來回答任何其他問題。感謝您的詳細回覆! – Loki70

+0

我忘記提及,因爲我通過sAMAccountName來搜索域,如果我錯了,請糾正我,但我們可以跳過foreach循環,並將ds.FindAll()更改爲ds。FindOne()並將所有內容封裝在try catch最終語句中。祝你好運! – Remy