イントラネット用に構築した複数の Web アプリケーションがあります。ユーザーがログインについて心配しないようにしたかったので、これらのアプリは、サイトにアクセスしたときに現在ログオンしているユーザーをプルします。これを実現するために、次のコードを使用しました。
Dim userName As String = User.Identity.Name
CurrentUser = userName.Substring(userName.IndexOf("\") + 1)
これは魅力のように機能しますが、ここでは問題ありません。次のステップは、ログインしているユーザーの Active Directory にクエリを実行して、さまざまな情報を取得することです。私が現在どのようにコーディングしているか、それは開発側の魅力のように機能します (私は IIS を実行していないため、典型的です)。
問題は、IIS サーバー (IIS 7.5 を実行している Windows Server 2008 R2) に公開すると、Active Directory をクエリするコード内の特定の行を指すエラー メッセージが表示されます。興味深いのは、これらのアプリが先週うまく機能していたことです。私のサーバー管理者が Windows Update の最新のバッチを実行した後、それらは壊れました (注意してください、私は .Net Framework 4.0 を使用してそれらを実行しています)
Windows 認証が有効になるように各アプリをセットアップする前に、他の認証タイプを無効にしました。プロバイダーの場合、ネゴシエートが 1 位、NTLM が 2 位です。詳細設定では、拡張保護 = オフ、およびカーネル モード認証を有効にするがオンになっています。
私のweb.configには次のセットがあります:
<customErrors mode="Off"/>
<authentication mode="Windows" />
<authorization>
<deny users="?"/>
</authorization>
これらは私が持っていた設定であり、すべてが魅力的に機能しました. NTLM が 1 位で、Negotiate が 2 位になるように、プロバイダーを交換する必要があります。このため、ユーザーの資格情報が正しく渡されず、AD クエリが失敗します。これは、クエリに使用しているコーディングです。
Dim adSearchRoot As New DirectoryEntry("LDAP://DC=[DOMAIN],DC=com")
Dim adSearch As New DirectorySearcher(adSearchRoot)
adSearch.Filter = "(&(ObjectClass=User)(sAMAccountName=" & CurrentUser & "))"
Dim searchResult As SearchResult = adSearch.FindOne()
更新以来、前にネゴシエートを使用してサイトをロードすると、DirectoryEntry にユーザー名/パスワードが設定されていないため、その最終行で失敗します。ユーザー名/パスワードを設定しても、以前のように 100% 機能しません。
だから私の質問は、ユーザーがサイトにアクセスし、ユーザー名を知り、DirectoryEntry でユーザー名/パスワードを使用せずに Active Directory を照会できるようにするには、どうすればよいですか??
IISの設定ですか?または、再コーディングする必要がありますか? おそらくweb.config設定?サーバーの更新を元に戻し、中断が発生した原因を特定する必要がありますか?
アドバイスありがとうございます。ご不明な点がございましたら、お気軽にお問い合わせください。
アップデート
Matt が提案したように、次のクリップを web.config ファイルに追加してみました。
<security>
<authorization>
<add accessType="Deny" users="?" />
</authorization>
</security>
これはうまくいきませんでした。いくつか読んだ後、このセクションをさらに変更しました。
<location path="Default Web Site/NameOfApp">
<system.webServer>
<security>
<authentication>
<anonymousAuthentication enabled="false"/>
<windowsAuthentication enabled="true">
<providers>
<add value="Negotiate" />
<add value="NTLM" />
</providers>
</windowsAuthentication>
</authentication>
<authorization>
<add accessType="Deny" users="?" />
</authorization>
</security>
</system.webServer>
</location>
これを行う際に、web.config セクションの上位にある文字列も削除しました。これも機能しませんでした(fyi、これは素晴らしいリファレンスでしたhttp://www.iis.net/ConfigReference/system.webServer/security/authentication)
次に、この記事に出くわしました: http://social.technet.microsoft.com/Forums/en/winserverDS/thread/7deba16b-295a-4887-98f9-9f291ed49871同様の状況のようです。この記事は最終的に「Double Hops」を参照しました。これを調べていくつかのことを試した後、これでも問題は解決しませんでした。
次のステップ
別の Server 2008 R2 システムで新しい IIS 7.5 の実装を試し、基本的に最初からやり直して、問題が再現するかどうかを確認します。
新しい提案は非常に役立ちます。