ローカルイントラネット環境で、Windowsドメインユーザーの偽装を使用する場合、アプリプールで「クラシック」パイプラインモードを使用する運命にあるのでしょうか。 )?
私の目標は、イントラネットのローカルWebアプリケーションにWindows認証を使用して、ユーザーがActive Directoryアカウント(原則)でアプリを認証および実行できるようにすることです。これを試すたびに(もちろんNetworkService IDを使用)、次のエラーが発生します。
Page.User.Identity.Name
などのさまざまな場所から取得した現在のユーザーのネットワークユーザー名を表示する小さなアプリを作成しました。また、Active Directoryへのクエリにいくつかの異なる方法を使用して、ドメインユーザーに関する情報を取得しました。これらすべてが以下を検証します。
私の調査によると、Windows認証を使用してアプリケーションを実行するための2つの主要なモードが見つかりました。これは主にイントラネット環境で使用されます。構成の最小必須要素は次のとおりです。
クラシックモード
統合モード
これがキッカーです!!
統合モード(はるかに多くの機能と統合を実現するので理想的)を使用する場合は、委任を有効にする必要があります。 委任 の基本を理解するために、また拡張 動的SPN登録 を理解するために、いくつかの必読の記事があります。これはKerberosとセキュリティの考慮事項にさらに踏み込むため、おそらく掘り下げて考える必要があるため、偽装を有効にして1日にそれを呼び出すだけで済むクラシックモードをそのまま使用する方が簡単な場合があります。または、チートしてvalidateIntegratedModeConfiguration
を無効にします。
いいえ。ただし、「統合」パイプラインでは、Windows認証済みユーザーを手動で偽装する必要があります。少なくともIIS8.5では、です。
どうして? クラシックな偽装は.NETの非同期機能を中断します 。具体的には、複数のユーザーが同時に使用しているスレッドのWindowsIdentityを管理することは困難です。
どうやって? WindowsImpersonationContextを使用 例.
// Start with identity assigned by IIS Application Pool
var current = System.Security.Principal.WindowsIdentity.GetCurrent();
// Enable Windows Authentication in ASP.NET *and* IIS, which ensures
// User.Identity is a WindowsIdentity
WindowsIdentity clientId = (WindowsIdentity)User.Identity;
// When 'using' block ends, the thread reverts back to previous Windows identity,
// because under the hood WindowsImpersonationContext.Undo() is called by Dispose()
using (WindowsImpersonationContext wic = clientId.Impersonate())
{
// WindowsIdentity will have changed to match clientId
current = System.Security.Principal.WindowsIdentity.GetCurrent();
}
// Back to the original identity
current = System.Security.Principal.WindowsIdentity.GetCurrent();