2

我有一個應用程序需要綁定到遠程客戶的Active Directory來執行身份驗證任務。UserPrincipal.FindByIdentity拋出PrincipalServerDownException

using (var ctx = new PrincipalContext(ContextType.Domain, "customer.org", "ou=people,dc=customer,dc=org", ContextOptions.SecureSocketLayer | ContextOptions.SimpleBind, "[email protected]", "password")) 
{ 
    var user = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, username); // after several seconds, throws PrincipalServerDownException 

    if (user == null) return null; // user doesn't exist 

    // check if the account is locked out, etc. (omitted) 

    // quickly validate credentials 
    if (!ctx.ValidateCredentials(username, password, ContextOptions.SecureSocketLayer | ContextOptions.SimpleBind)) return null; // bad credentials 

    return user; 
} 

例外情況是:

PrincipalServerDownException:服務器不可操作。

at System.DirectoryServices.AccountManagement.ADStoreCtx.GetAsPrincipal(Object storeObject, Object discriminant) 
at System.DirectoryServices.AccountManagement.ADStoreCtx.FindPrincipalByIdentRefHelper(Type principalType, String urnScheme, String urnValue, DateTime referenceDate, Boolean useSidHistory) 
at System.DirectoryServices.AccountManagement.ADStoreCtx.FindPrincipalByIdentRef(Type principalType, String urnScheme, String urnValue, DateTime referenceDate) 
at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper(PrincipalContext context, Type principalType, Nullable`1 identityType, String identityValue, DateTime refDate) 
at System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext context, Type principalType, IdentityType identityType, String identityValue) 
at System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext context, IdentityType identityType, String identityValue) 

直到今天,事情做工精細。一個變化是運行此代碼的應用程序從4升級到4.5。我無法確定在升級後是否立即發生問題,或者這只是一個巧合。

我一直在使用AdFind來測試客戶的AD綁定,它似乎工作正常。

另一個有趣的事情是,PrincipalContext初始化就好了(因此驗證其對遠程存儲連接),如果我註釋掉FindByIdentity調用,這樣只是ctx.ValidateCredentials被調用時,工作正常了。

+0

看到http://stackoverflow.com/questions/12608971/net-4-5- bug-in-userprincipal-findbyidentity-system-directoryservices-accountma?rq = 1 – 2013-04-23 15:23:55

回答

3

其實4.5可能是問題。對「安全」UerPrincipal.FindByIdentity進行了一些更改。他們傾向於在跨域和工作組=>域方案中破壞代碼。

您至少有兩種可能性:

  • 恢復到4.0
  • 使用的DirectoryEntry代替
+0

是的,我根據@Josh E的評論進一步調查了它。當使用FindByIdentity時,似乎嘗試使用DNS來解析站點服務,這是不行的。我試圖僞造DNS區域,並記錄它要求但沒有喜悅。我已經恢復到'DirectoryEntry',這讓我很懊惱。 – HackedByChinese 2013-04-24 19:20:30

相關問題