更新 2
この質問はもともと「偽装は Web API で機能しますか?」というものでした。
そして、その質問に対する質問は、「はい、そうです」です。
しかし、問題は Web API ではなく、なりすましそのものでした。(問題の説明は以下にあります)
しかし今、私は解決策について他の人に伝えたいと思います.
私のコントローラーは非同期であり、偽装されたスレッドによって生成されたスレッドは親と同じ ID を持つという誤った前提がありました。
デフォルトでは false です。TPL はスレッド間で偽装をフローしません。
偽装フローは、プログラムまたは構成で有効にすることができます。アプリケーションの web.config ではなく、 aspnet.configファイル
を変更する必要があることに注意してください。
この投稿に記載されているように、aspnet.config ファイルはアプリケーション プールごとに設定できます。
そして、この投稿には、親切に提供されたアンドリューへのリンクが、クエスト全体について詳しく説明しています。
偽装を初めてオンにする方には、IIS 7.5 には、偽装されたアカウントの資格情報を入力するための非常に優れた機能があることに注意してください。これらの資格情報は構成ファイルには必要なく、書き込むだけで十分です。
<identity impersonate="true"/>
資格情報を入力すると、構成ファイルに自動的に追加されます。
元の質問:
偽装をオンにして、ユーザー資格情報を提供しました。
<identity impersonate="true" usernName="foo" password="bar"/>
しかし、Entity Framework 経由で SQL Server に接続すると、「ユーザー {MachineName}$ のログインに失敗しました」というエラーが表示されます。つまり、EF は IUSR アカウントで実行されます。一方WindowsIdentity.GetCurrent()
、'foo' ユーザーの ID を返します。
偽装されたアカウントには、Windows 認証が有効になっている SQL サーバーで必要なすべての権限があります。
さらに、偽装を無効にして、アプリケーション プールをこの ID の資格情報で実行するように設定すると、すべて正常に動作します。
偽装がオンのときになぜ機能しないのか理解できませんが、AppPool はデフォルト アカウントで実行されます。
更新 1
EF接続文字列は
<add name="PtKbEntities" connectionString="metadata=...;provider=System.Data.SqlClient;provider connection string="data source=...;initial catalog=...;Trusted_Connection=Yes;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
Win2008 Srv、IIS 7.5 でアプリケーションをホストしています