6

序章

Active Directory を照会する従来の ASP.NET 3.5 アプリケーションを維持しています。アプリケーションは「統合 Windows 認証」を使用し、専用のユーザー名とパスワードではなく、独自のセキュリティ コンテキストを使用して Active Directory に接続するように設計されています。

関連するコードは次のとおりです。

using (DirectoryEntry root = new DirectoryEntry())
using (DirectorySearcher searcher = new DirectorySearcher(root))
{
    searcher.Filter = string.Format("(&(samAccountName={0})(objectClass=user)(objectCategory=person))", userName.Trim());
    SearchResultCollection results = searcher.FindAll();
}

ASP.NET 3.5 を使用していますが、既存のインフラストラクチャの制約により、ASP.NET 4.0 アプリケーション プールから実行できる必要があります。

問題

を呼び出すとFindAll、特定の状況下で次の例外がスローされます。

System.DirectoryServices.DirectoryServicesCOMException (0x80072020): 操作エラーが発生しました。

Visual Studio デバッガーで例外オブジェクトを調べると、ExtendedErrorMessageプロパティにはより詳細な情報が含まれています。

000004DC: LdapErr: DSID-0C0906E8、コメント: この操作を実行するには、接続でバインドを成功させる必要があります。、データ 0、v1db1

次のスクリーンショットは、これが Visual Studio のデバッガーでどのように表示されるかを示しています。

ExtendedErrorMessage プロパティが 000004DC に設定された DirectoryServicesCOMException を示す画像: LdapErr: DSID-0C0906E8、コメント: この操作を実行するには、接続で正常にバインドする必要があります。データ 0、v1db1

機能するもの

これを機能させるための回避策をいくつか見つけましたが、どれも受け入れられません。

  1. 統合 Windows 認証を無効にし、代わりに基本認証を使用します。
  2. IIS では、 Network Serviceアカウントと ASP.NET の偽装を無効にして、ASP.NET 2.0 でアプリケーションを実行します。
  3. ホスト名としてlocalhostを使用して、Web サーバーからのみアプリケーションにアクセスします。
  4. web.config でハードコーディングされたアカウントで ASP.NET 偽装を使用する。

機能しないもの

インターネットからいくつかの提案を見つけましたが、どれも問題を完全に解決するものではありませんでした:

  1. を使用しHostingEnvironment.Impersonate()ます。
  2. なりすましの無効化。

私が欲しいもの

Active Directory で何も再構成する必要なく、これを機能させたいと考えています。上記のように特定の IIS 構成で問題なく動作するので、アプリケーションまたは IIS の再構成 (.NET Framework のバージョンの変更を除く) で動作させることができるはずです。

4

1 に答える 1