Windows イントラネット環境で ASP.net アプリケーションを実行しています。現在ログインしているユーザーとして特定のデータベース更新を実行する必要があります。
IIS/サーバー情報:
- IIS バージョン 10
- Windows サーバー 2019
- ASP.net Web フォーム アプリケーション
- .NET 4.7
- Windows 認証が有効
- 偽装と匿名認証が無効になっています
- アプリ プールは統合されたパイプラインを使用します
- アプリ プールは、必要に応じて他のリソースにアクセスする権利を持つ、その ID の ドメイン サービス アカウントで実行されます。
その他の詳細:
- すべてのデータベース接続文字列は、統合セキュリティ = true のように設定されています
- Active Directory で、Web サーバーと SQL サーバー間の制約付き委任を構成し、MSSQLSvc : 1433およびMSSQLSvc (ポートなし)を許可する
- ドメイン サービス アカウントは、Web サーバーのローカル管理者グループのメンバーです (テスト目的のみ)。
現在ログインしているユーザーとして実行する必要があるデータベースの更新を実行すると、次のように偽装します。
var windowsIdentity = User.Identity as WindowsIdentity;
WindowsIdentity.RunImpersonated(windowsIdentity.AccessToken, () =>
{
// perform database update
});
これは例外をスローします -
System.Data.SqlClient.SqlException: Login failed for user 'NT AUTHORITY\ANONYMOUS LOGON'
AppPoolIdentity (デフォルトのアプリ プール ID)を使用するようにアプリ プール ID を変更すると 、偽装は正しく機能します。
この偽装がAppPoolIdentityでは機能するのに、ドメイン サービス アカウントでは機能しないのはなぜですか?