私は把握しようとしている本当に奇妙な動作があります。PrincipalContext ValidateCredentialsは、Web APIで使用されると一部のユーザーに失敗する
次のコードに従って、Active Directoryに対してユーザーの資格情報を検証するために使用されるIISで実行されるASP.NET 4.5 Web APIがあります。
ADの一部のユーザーでは機能しますが、ADの他のユーザーには常にfalseが返されます。私のカスタムmessageHandlerのログから、私はそれがmessageHandler.WriteSuccessの部分に到達していることを知っています。だから私はそれが例外をスローしていないことを知っている。
ウェブサーバーで同じコードを使用してWindowsフォームデスクトップアプリケーションを作成して問題のトラブルシューティングを支援しましたが、すべてのユーザーを正しく検証します。
これは、ASP.NET Web APIがネットワークサービスとして実行されている可能性があります。私は、Webサーバーにログインしたときと同じIDを使用するようにアプリケーションプールを変更しましたが、違いはありませんでした。
なぜ完全に同じコードがWindowsフォームアプリケーションで正しくユーザーを検証しますが、ASP.net Web APIでは一部のユーザーのみが正しく検証されるのでしょうか。
回避策として、ネットワーク管理者は、ログインに失敗したユーザーのために新しいADユーザーを作成しています。これは機能しています。失敗したADユーザと成功したADユーザとの間にはいくつかの違いがある。
また、IISの実行と比較して、デスクトップアプリケーションとして実行すると、同じコードが異なる動作をすることは非常に奇妙です。
これ以上問題を解決する方法や問題を解決する方法はありますか? サーバーはWindows Server 2008 R2です。
PrincipalContext pc = null;
try
{
pc = new PrincipalContext(ContextType.Domain, domain);
var success = pc.ValidateCredentials(username, password);
if (loggingEnabled)
{
messageHandler.WriteSuccess(
username,
HistoryLogEntry.OperationType.ActiveDirectory,
HistoryLogEntry.RequestType.ActiveDirectoryAuthenticate, success.ToString());
}
return success;
}
catch (PrincipalServerDownException ex)
{
var displayMessage = string.Format("Please check your Web Service settings. {0} {1}", ex.Message,
ex.InnerException == null ? "" : ex.InnerException.Message);
messageHandler.WriteHistory(
username,
HistoryLogEntry.OperationType.ActiveDirectory,
HistoryLogEntry.RequestType.ActiveDirectoryAuthenticate,
ex, displayMessage);
messageHandler.ThrowLastAsHttpError();
return false;
}
finally
{
if (pc != null)
{
pc.Dispose();
}
}