web-dev-qa-db-ja.com

統合パイプラインでドメインユーザーを偽装する

ローカルイントラネット環境で、Windowsドメインユーザーの偽装を使用する場合、アプリプールで「クラシック」パイプラインモードを使用する運命にあるのでしょうか。 )?

私の目標は、イントラネットのローカルWebアプリケーションにWindows認証を使用して、ユーザーがActive Directoryアカウント(原則)でアプリを認証および実行できるようにすることです。これを試すたびに(もちろんNetworkService IDを使用)、次のエラーが発生します。

screenshot of error message

22
Chiramisu

Page.User.Identity.Nameなどのさまざまな場所から取得した現在のユーザーのネットワークユーザー名を表示する小さなアプリを作成しました。また、Active Directoryへのクエリにいくつかの異なる方法を使用して、ドメインユーザーに関する情報を取得しました。これらすべてが以下を検証します。

私の調査によると、Windows認証を使用してアプリケーションを実行するための2つの主要なモードが見つかりました。これは主にイントラネット環境で使用されます。構成の最小必須要素は次のとおりです。

クラシックモード

  • AppPool-クラシックモードに設定されたマネージパイプライン。
  • AppPool-ネットワークサービスに設定されたID。
  • 認証-無効:匿名認証
  • 認証-有効:ASP.NET偽装
  • 認証-有効:Windows認証
  • プロバイダー-無効:Kerberos
  • 詳細設定-カーネルモード:いずれか

統合モード

  • AppPool-マネージドパイプラインが統合モードに設定されています。
  • AppPool-ネットワークサービスに設定されたID。
  • 認証-無効:匿名認証
  • 認証-無効:ASP.NET偽装
  • 認証-有効:Windows認証
  • プロバイダー-有効:Kerberos
  • 詳細設定-カーネルモード:無効

これがキッカーです!!

統合モード(はるかに多くの機能と統合を実現するので理想的)を使用する場合は、委任を有効にする必要があります。 委任 の基本を理解するために、また拡張 動的SPN登録 を理解するために、いくつかの必読の記事があります。これはKerberosとセキュリティの考慮事項にさらに踏み込むため、おそらく掘り下げて考える必要があるため、偽装を有効にして1日にそれを呼び出すだけで済むクラシックモードをそのまま使用する方が簡単な場合があります。または、チートしてvalidateIntegratedModeConfigurationを無効にします。

26
Chiramisu

いいえ。ただし、「統合」パイプラインでは、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();

問題? 偽装の代わりに委任を使用する必要がある場合があります。

12
Donal Lafferty