認証をデータベースに転送する必要がある ASP.NET 4.0 アプリケーションがあります。この支援要請のために、Web サーバー "app1" とデータベース サーバー "sql1" を呼び出します。
SQL2008R2 データベース サービスは、カスタム ドメイン アカウント「SqlServer」の下で、名前付きインスタンス「SQL2008R2」として実行されています。サーバーは Windows Server 2008 R2 Enterprise Edition を実行しています。このための SPN を作成しました...
setspn -a MSSQLSvc/sql1.mydomain.local:SQL2008R2 SqlServer
ASP.NET アプリケーションは、統合パイプライン モードで、カスタム ドメイン アカウント "WebApplicationUser" を使用してアプリケーション プールで実行されています。現在、Windows 7 Enterprise を実行しているラップトップで実行していますが、最終的には Windows Server 2008 R2 Standard Edition でホストされる予定です。アプリケーション用に 2 つの SPN を作成しました (現在実行している Windows 7 マシン上)...
setspn -a http/app1 WebApplicationUser
setspn -a http/app1.mydomain.local WebApplicationUser
Active Directory ユーザーとコンピューター内で、「WebApplicationUser」アカウントを選択し、任意のプロトコルを使用して「MSSQLSvc/sql1.mydomain.local:SQL2008R2」への制約付き委任を有効にしました (Kerbero のみを使用してみました)。
アプリケーションは IIS 7.5 でセットアップされ、認証は「ASP.NET 偽装」と「Windows」を有効にしながら、匿名、基本、ダイジェスト、およびフォームを無効にするように設定されています。Windows 認証では、「拡張保護」がオフになり、「カーネル モード認証」が有効になります。プロバイダは「Negotiate」「NTLM」の順です。
ASP.NET アプリケーションは EF を使用し、接続文字列は統合セキュリティを使用するように構成されています...
<connectionStrings>
<add name="MyContext"
connectionString="metadata=res://*/Data.MyModel.csdl|res://*/Data.MyModel.ssdl|res://*/Data.MyModel.msl;provider=System.Data.SqlClient;provider connection string="Data Source=sql1.mydomain.local\sql2008r2;Initial Catalog=MyDatabase;Persist Security Info=false;Integrated Security=True;MultipleActiveResultSets=True""
providerName="System.Data.EntityClient" />
</connectionStrings>
私の Web 構成では、Windows 認証と偽装の両方を指定しています。非同期ページを使用しているため、偽装ポリシーのフローも有効にしています...
<runtime>
<alwaysFlowImpersonationPolicy enabled="true" />
</runtime>
<system.web>
<authentication mode="Windows" />
<identity impersonate="true" />
</system.web>
ローカル (「web1」) でログオンし、(IE を使用して) アプリケーションを参照すると、これはすべて機能しますが、これには解決しようとしているダブル ホップは含まれません。
別のマシンにログオンして IE を使用してアプリケーションを参照するか、FireFox を使用してローカル マシンから参照すると、これは機能しません - 注: FireFox はログインの詳細を要求します。データベースへの接続が「ユーザー 'NT AUTHORITY\ANONYMOUS LOGON' のログインに失敗しました」で失敗する
多くの記事とは異なり (ここが問題の一部である可能性があります)、ユーザーになりすますカスタム コードは使用していません。上記の web.config 設定により、偽装がアプリケーション全体に適用されることを理解しています。私がすることは、接続を開き、終了したら再び閉じることだけです。
私は明らかに 1 つ (または 2 つ) のステップを見逃していますが、見つけられるすべてのドキュメント (そしてたくさんあります) を見ても、そのステップが何であるかをまだ見つけることができません。私が見つけることができるドキュメントの 99% が実際には IIS6 と Windows 2003 に関連していることは役に立ちませんが、原則は同じままである必要があります。
このような構成を Windows 7 や Windows Server 2008 で動作させることに成功した人はいますか?