奇妙なことが起こる...
新しい開発者マシン (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# コードはそこから値を抽出できません :(