奇怪的事情发生了……
我被迫转移到一台新的开发机器(Windows Server 2008 R2 到 2012)。完全相同的代码在新机器上不起作用。
public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords)
{
MembershipUserCollection retvalue = new MembershipUserCollection();
string ldapConnectionString = _configuration.GetConnectionString();
using (DirectoryEntry de
= new DirectoryEntry(ldapConnectionString, _configuration.SearchAccount, _configuration.SearchAccountPassword, AuthenticationTypes.ServerBind))
{
string filter = string.Format("(&(objectClass=Person)(CUSTOMemail={0}))", emailToMatch);
DirectorySearcher ds = new DirectorySearcher(de, filter, new[] { "cn", "CUSTOMemail" }, SearchScope.Subtree);
SearchResultCollection collection = ds.FindAll();
totalRecords = collection.Count;
int pagesCount = (totalRecords > pageSize) ? (int)Math.Ceiling((double)(totalRecords / pageSize)) : 1;
if (pageIndex > pagesCount - 1)
throw new IndexOutOfRangeException("PageIndex exceeds max PageIndex");
for (int i = pageIndex * pageSize; i < totalRecords; i++)
{
DirectoryEntry userDirectoryEntry = collection[i].GetDirectoryEntry();
string userName = userDirectoryEntry.Properties["cn"].Value as string;
string providerUserKey = userDirectoryEntry.Path;
string email = userDirectoryEntry.Properties["CUSTOMemail"].Value as string;
MembershipUser mu = new MembershipUser(
providerName: Name,
name: userName,
providerUserKey: providerUserKey,
email: email,
passwordQuestion: null,
comment: null,
isApproved: true,
isLockedOut: false,
creationDate: DateTime.MinValue,
lastLoginDate: DateTime.MinValue,
lastActivityDate: DateTime.MinValue,
lastPasswordChangedDate: DateTime.MinValue,
lastLockoutDate: DateTime.MinValue);
retvalue.Add(mu);
}
}
return retvalue;
}
代码在尝试读取 CUSTOMemail 属性时失败。系统属性(例如“cn”)起作用。
IIS 设置完全相同,尽管这无关紧要,因为绑定过程有效。域成员身份(我阅读了有关此的各种线程)没有改变,也没有关系,因为它是一个电子目录,而且我正在使用专用用户进行绑定。
我可以过滤属性(见上文)并查看所有属性的名称。网络跟踪显示属性及其值是通过网络传输的,所以我需要的一切都在那里。并且使用 JXplorer 之类的 LDAP 资源管理器向我展示了完整的 DirectoryEntry(包括值)。但是我的 C# 代码与它不兼容。我对为什么它在一台虚拟机上运行而不在另一台上运行感到非常困惑。
我对所有数据都通过网络传输的事实很感兴趣(因此该目录绝对没有权限问题),但我的 C# 代码无法从中提取值:(