2013-02-01 129 views
0

我有一個有趣的問題,我一直試圖解決幾天。C#LDAP驗證適用於一個DC,但不適用於另一個DC

我目前正在使用運行Active Directory標準實例的Windows Server 2003計算機。

該目錄包含兩個域組件(DC),這兩個域組件都包含將要通過我的應用程序對目錄進行授權的用戶。

我使用:

  • 服務器作爲主機名的IP地址
  • 通過端口的SSL連接3269
  • 的GSS協商驗證機制
  • 一個的BaseDN是一個這兩個DC的
  • 的sAMAccountName賦的parentDN作爲登錄名

問題是,我無法成功授權來自DC1的任何用戶,但屬於DC2的所有用戶都完全正常,並且工作得很好。我得到這個錯誤在DC1:

8009030C: LdapErr: DSID-0C09043E, comment: AcceptSecurityContext error, data 0, vece System.DirectoryServices.Protocols.LdapException: The supplied credential is invalid.

但是,使用Softerra的的LDAP Broswer,我可以連接並授權沒有任何問題完全相同的用戶,所以我知道的憑據是正確的。

從我所知道的來看,這兩個DC的配置都是一樣的......我瀏覽過他們兩個人的東西,任何不同的東西......但沒有發現真正突出的東西。

我在幾個月前發佈了關於這個特定設置的東西,我使用的代碼也在該線程中。

Set callback for System.DirectoryServices.DirectoryEntry to handle self-signed SSL certificate?

這裏任何幫助將非常感激。

謝謝!

回答

1

我能夠得到這個工作,但對於我的生活,我無法弄清楚爲什麼會出現這種情況。基本上,這個錯誤...

8009030C: LdapErr: DSID-0C09043E, comment: AcceptSecurityContext error, data 0, vece System.DirectoryServices.Protocols.LdapException: The supplied credential is invalid. 

...死了。問題在於,用戶登錄到DC2所需的域名AND sAMAccountName(Ex。LIB \ JSmith)發出綁定,而不是DC1,它只允許輸入sAMAccountName。

我想通過使用主體綁定帳戶來查詢用戶的DN的最佳方法。從該DN,使用一些狡猾的RegEx,我能夠捕獲它們繼承的域,併發出兩個單獨的綁定。

SearchResultEntry ResultEntry = userResponse.Entries[0]; 

//Let's get the root domain of the user now using our DN RegEx and that search result 
Regex RegexForBaseDN = new Regex(config.LdapAuth.LdapDnRegex); 
Match match = RegexForBaseDN.Match(ResultEntry.DistinguishedName); 
string domain = match.Groups[1].Value; 

//Try binding the user with their domain\username 
try 
{ 
    var thisUser = new NetworkCredential{ 
             Domain = domain, 
             UserName = username, 
             Password = Pin 
             }; 

    //If this goes well, we'll continue forward 
    ldapconn.Bind(thisUser); 
} 

//If that doesn't work, try biding them with the highest level domain 
catch (LdapException ex) 
{ 
    if (ex.ErrorCode.Equals(LdapErrorCodes.LDAP_INVALID_CREDENTIALS)) 
    { 
      var thisUserOnce = new NetworkCredential{ 
                Domain = config.LdapAuth.LdapDomain, 
                UserName = username, 
                Password = Pin 
                }; 

      //If this goes well, we'll continue forward 
      ldapconn.Bind(thisUserOnce); 
     } 
} 

它幾乎沒有我想要的那麼優雅,但它確實適用於這種特殊場景。

但是,我仍然對命名約定爲什麼不同,這取決於用戶從哪個DC繼承。

相關問題