Windows 7/IIS 7.5 で実行されている ASP.NET 4.0 アプリケーションが、ネットワーク サービスとして実行するように構成された "ASP.NET v4.0 Classic" アプリケーション プールにあります。アプリケーションにはApplication_EndRequest
、ローカルの SQL Server インスタンスに接続するハンドラーがあります。SQL 接続文字列は を指定しますIntegrated Security=SSPI
。Web.config にはありません<identity impersonate="true" />
。
を参照するhttp://localhost/TestSite/
と、次の例外がスローされます。
System.Data.SqlClient.SqlException (0x80131904): Login failed for user 'NT AUTHORITY\IUSR'.
...
at System.Data.SqlClient.SqlConnection.Open()
at Global.Application_EndRequest(Object sender, EventArgs e)
(IIS で構成された既定のドキュメント) またはその他の .aspx ページを参照しても、この例外はスローされません。http://localhost/TestSite/default.aspx
そのような場合、アプリケーションは有効なログインである "NT AUTHORITY\NETWORK SERVICE" として SQL Server に正しく接続します。
偽装が無効になっているにもかかわらず、ASP.NET が EndRequest で "NT AUTHORITY\IUSR" を偽装するのはなぜですか? これは ASP.NET のバグですか?
次の Global.asax.cs ファイルは、問題を示しています。
public class Global : HttpApplication
{
public Global()
{
this.BeginRequest += delegate { Log("BeginRequest"); };
this.PreRequestHandlerExecute += delegate { Log("PreRequestHandlerExecute"); };
this.PostRequestHandlerExecute += delegate { Log("PostRequestHandlerExecute"); };
this.EndRequest += delegate { Log("EndRequest"); };
}
protected void Application_EndRequest(Object sender, EventArgs e)
{
try
{
using (SqlConnection connection = new SqlConnection("Server=.;Integrated Security=SSPI"))
{
connection.Open();
}
}
catch (Exception ex)
{
Trace.WriteLine(ex);
}
}
private static void Log(string eventName)
{
HttpContext context = HttpContext.Current;
Type impersonationContextType = typeof(HttpContext).Assembly.GetType("System.Web.ImpersonationContext", true);
Trace.WriteLine(string.Format("ThreadId={0} {1} {2} Impersonating={3}",
Thread.CurrentThread.ManagedThreadId,
context.Request.Url,
eventName,
impersonationContextType.InvokeMember("CurrentThreadTokenExists", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.GetProperty, null, context, null)));
}
}
トレース出力は次のとおりです。
ThreadId=3 http://localhost/TestSite/ BeginRequest Impersonating=False
ThreadId=3 http://localhost/TestSite/ PreRequestHandlerExecute Impersonating=False
ThreadId=7 http://localhost/TestSite/default.aspx BeginRequest Impersonating=False
ThreadId=7 http://localhost/TestSite/default.aspx PreRequestHandlerExecute Impersonating=False
ThreadId=7 http://localhost/TestSite/default.aspx PostRequestHandlerExecute Impersonating=False
ThreadId=7 http://localhost/TestSite/default.aspx EndRequest Impersonating=False
ThreadId=7 http://localhost/TestSite/ PostRequestHandlerExecute Impersonating=True
ThreadId=7 http://localhost/TestSite/ EndRequest Impersonating=True
System.Data.SqlClient.SqlException (0x80131904): Login failed for user 'NT AUTHORITY\IUSR'.
...
at System.Data.SqlClient.SqlConnection.Open()
at Global.Application_EndRequest(Object sender, EventArgs e)
TestSite/
( にマップされている) へのリクエストは、( にマップされている)へのネストされたリクエストをDefaultHttpHandler
生成するように見えることに注意してください。ASP.NET は の処理を終了した後、 への要求の処理を再開するときに "NT AUTHORITY\IUSR" を偽装します。TestSite/default.aspx
ASP.default_aspx
TestSite/default.aspx
TestSite/
更新:この問題をMicrosoft Connectに送信しました。