2012-12-11 25 views
0

我遵循tutorial在ASP.NET/C#4.0 Web應用程序上實現LDAP身份驗證。雖然事情似乎有效,但當我將該網站置於IIS7下時,它無法獲取組名。LDAP - 獲取用戶的組名失敗IIS

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Text; 
using System.Collections; 
using System.DirectoryServices; 
using System.DirectoryServices.ActiveDirectory; 

namespace KEWeb 
{ 
    public class LdapAuthentication 
    { 
     private string _path; 
     private string _filterAttribute; 
     private string _username; 
     private string _password; 
     private string _domain; 
     private string _domainAndUsername; 
     private DirectoryEntry _entry; 
     private DirectorySearcher _search; 
     private SearchResult _result; 

     public LdapAuthentication(string path, string domain, string username, string password) 
     { 
      _path = path; 
      _domain = domain; 
      _username = username; 
      _password = password; 
      _domainAndUsername = _domain + @"\" + _username; 
      _entry = new DirectoryEntry(_path, _domainAndUsername, _password); 

     } 

     public bool IsAuthenticated() 
     { 
      try 
      { 
       Object obj = _entry.NativeObject; 
       _search = new DirectorySearcher(_entry); 
       _search.Filter = "(SAMAccountName=" + _username + ")"; 
       _search.PropertiesToLoad.Add("cn"); 
       _result = _search.FindOne(); 
       if (null == _result) { return false; } 
       _path = _result.Path; 
       _filterAttribute = (String)_result.Properties["cn"][0]; 
      } 
      catch (Exception ex) { throw new Exception("Error authenticating user: " + ex.Message); } 
      return true; 
     } 

     public string GetGroups() 
     { 
      string r = ""; 
      try 
      { 
       Object obj = _entry.NativeObject; 
       _search = new DirectorySearcher(_entry); 
       _search.Filter = "(SAMAccountName=" + _username + ")"; 
       _search.PropertiesToLoad.Add("cn"); 
       _result = _search.FindOne(); 
       if (null != _result) 
       { 
        _path = _result.Path; 
        _filterAttribute = (String)_result.Properties["cn"][0]; 
        _search = new DirectorySearcher(_path); 
        _search.Filter = "(cn=" + _filterAttribute + ")"; 
        _search.PropertiesToLoad.Add("memberOf"); 
        StringBuilder groupNames = new StringBuilder(); 
        _result = _search.FindOne(); 
        int propertyCount = _result.Properties["memberOf"].Count; 
        String dn; 
        int equalsIndex, commaIndex; 
        for (int propertyCounter = 0; propertyCounter < propertyCount; propertyCounter++) 
        { 
         dn = (String)_result.Properties["memberOf"][propertyCounter]; 
         equalsIndex = dn.IndexOf("=", 1); 
         commaIndex = dn.IndexOf(",", 1); 
         if (-1 == equalsIndex) { return null; } 
         groupNames.Append(dn.Substring((equalsIndex + 1), (commaIndex - equalsIndex) - 1)); 
         groupNames.Append("|"); 
        } 
        r = groupNames.ToString(); 
       } 
      } 
      catch (Exception ex) { throw new Exception("Error obtaining group names: " + ex.Message); } 

      return r; 
     } 
    } 
} 

在從Visual Studio 2010調試時運行它時,它工作正常。但在IIS7上,它給出了一個錯誤An operations error occured.不知道如何在IIS下調試,儘管我確信它是可能的。如果我完全忽略GetGroups()並發表評論,它的工作原理,但我當然需要這些組名稱。

PS - 是的,上面的代碼與原始代碼沒什麼兩樣,我調整它重新使用一些冗餘的東西。然而,在我改變這個之前,我確實有這個問題。

+0

這是一個目錄權限問題?換句話說:連接到IIS服務器的用戶(或計算機)是否有權執行查詢?在我的場景中,我的開發框不是目錄的成員。我會查詢,幾乎任何查詢都會得到一個DirectoryServicesCOMException。 –

+0

如果是這種情況,那麼它會是另一種方式,因爲正在工作的是標準用戶,並且IIS機器是域管理員,但是隨後IIS又在會話0中運行。兩臺機器都是同一個子網中的同一個域。 –

+0

在我們的環境中,我們必須將應用程序池的標識設置爲有權訪問該目錄的用戶。 –

回答

2

你使用了錯誤的項目爲團體搜索 - 你需要使用:

_search = new DirectorySearcher(_path); 

GetGroups()通話。 _path變量由IsAuthenticated()調用設置。

+0

實際上'_path'是由我設置的,然後用'IsAuthenticated()'重新設置... –

+0

我不理解你想說什麼,上面的代碼行正是我的代碼。 –

+0

等一下,它實際上有兩次了,我明白你現在說的,我有兩次這樣做的原因是,當它得到組名時,它會在現場重新進行身份驗證。我有一個'GetGroups()'不工作的問題,因爲'IsAuthenticated()'從未被調用過。也許我只需要重新構建整個班級。 –

1

如果連接到w3wp進程,您可以在iis下調試應用程序。使用CTRL + Alt + P熱鍵附加到它,或轉到調試菜單,然後選擇附加到過程...並檢入「顯示所有會話中的過程」複選框。

+0

...假設IIS和Visual Studio在同一臺機器上?因爲他們不是。 –

+2

Visual Studio中有一個遠程調試工具。它的默認位置爲C:\ Program Files文件(x86)的\微軟的Visual Studio 10.0 \ Common7 \ IDE \遠程調試器。您需要將msvsmon.exe複製到IIS的駐留和運行它的計算機。然後轉到Studio並從限定符瀏覽到遠程計算機。畢竟你應該看到w3wp進程並附加到它。但是遠程計算機必須與Studio運行的計算機位於同一個域中。 – Blackstar

0

這可能太晚了,但我有完全相同的問題。

對我來說,這是IIS網站有ASP.Net模擬和匿名都啓用和模擬用戶被配置爲使用經過身份驗證的用戶。由於匿名也被啓用,因爲匿名用戶無權訪問AD,所以這總是會失敗。

更改ASP.Net模擬使用有效的AD帳戶,瞧!

約翰

PS。和你一樣,我也從同一篇教程開始工作。 :)