我有一个需要绑定到远程客户的Active Directory来执行身份验证任务的应用程序。

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来测试针对客户广告的绑定,它似乎运行良好。

另一个有趣的事情是,PrincipalContext初始化就很好(并因此验证了它与远程存储的连接),如果我注释掉FindByIdentity调用,那么仅调用ctx.ValidateCredentials也是可以的。

最佳答案

实际上4.5可能是问题所在。 “安全” UerPrincipal.FindByIdentity进行了一些更改。他们倾向于在跨域和工作组=>域方案中破坏代码。

您至少有两种可能性:


还原至4.0
改用DirectoryEntry

10-05 21:22