22

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

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

エラー メッセージのスクリーンショット

4

2 に答える 2

27

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

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

クラシックモード

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

統合モード

  • AppPool - 統合モードに設定されたマネージド パイプライン。
  • AppPool - Network Service に設定された ID。
  • 認証 - 無効: 匿名認証
  • 認証 - 無効: ASP.NET 偽装
  • 認証 - 有効: Windows 認証
  • プロバイダー - 有効: Kerberos
  • 詳細設定 - カーネル モード: 無効

さあキッカーだ!!

統合モード (より多くの機能と統合が得られるので理想的です) を使用する場合は、委任を有効にする必要があります。ここでは、 Delegationの基本と、さらにDynamic SPN Registrationを理解するために必読の記事をいくつか紹介します。これは、おそらく掘り下げたいと思う Kerberos とセキュリティに関するより多くの考慮事項になるため、偽装を有効にして 1 日で終了するだけのクラシック モードに固執する方が簡単かもしれません。または、ごまかして無効にしvalidateIntegratedModeConfigurationます。

于 2012-10-29T17:23:52.090 に答える
13

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

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

于 2014-03-27T15:43:47.043 に答える