私は、ASP.NET application
にADFSに対するクレームベース認証を使用しています。また、Windows Identity Serviceへのクレームを使用してWindowsClaimsIdentity
にマップします。それはうまく動作します。ASP.NET IDをWindows IDに偽装する
しかし、私は現在のリクエスト/スレッドを偽装して、クレーム対応ではないサービスにアクセスできるようにする必要があります。私はどうしたらいいですか?
私はApplication_PostAuthenticate
イベントでWindowsImpersonationContext
を取得し、HttpContext.Items
で、その後Application_EndRequest
呼び出し元に戻す方法でそれを保存する必要がありますか?
これを行うには他の方法がありますか?
更新:偽装する方法が何であるかについてのヒントが得られなかったので、自分の提案を試みました。私はトレースログに見ると、私はあなたがスレッドを正しく偽装されて見ることができる2行目だから、この
PostAuthenticateRequest PreImpersonate: NT AUTHORITY\NETWORK SERVICE
PostAuthenticateRequest PostImpersonate: MyDomain\CorrectUser
Home: NT AUTHORITY\NETWORK SERVICE
EndRequest PreUndoImpersonate: NT AUTHORITY\NETWORK SERVICE
EndRequest PostUndoImpersonate: NT AUTHORITY\NETWORK SERVICE
を参照してください
private static readonly string WICKey = typeof(System.Security.Principal.WindowsImpersonationContext).AssemblyQualifiedName;
protected void Application_PostAuthenticateRequest()
{
var wid = User.Identity as System.Security.Principal.WindowsIdentity;
if (wid != null)
{
HttpContext.Current.Trace.Write("PostAuthenticateRequest PreImpersonate: " + System.Security.Principal.WindowsIdentity.GetCurrent().Name);
HttpContext.Current.Items[WICKey] = wid.Impersonate();
HttpContext.Current.Trace.Write("PostAuthenticateRequest PostImpersonate: " + System.Security.Principal.WindowsIdentity.GetCurrent().Name);
}
}
protected void Application_EndRequest()
{
var wic = HttpContext.Current.Items[WICKey] as System.Security.Principal.WindowsImpersonationContext;
if (wic != null)
{
HttpContext.Current.Trace.Write("EndRequest PreUndoImpersonate: " + System.Security.Principal.WindowsIdentity.GetCurrent().Name);
wic.Undo();
HttpContext.Current.Trace.Write("EndRequest PostUndoImpersonate: " + System.Security.Principal.WindowsIdentity.GetCurrent().Name);
}
}
:私はglobal.asax.csでこのコードを作成しました。しかし、次の行では、偽装が失われていることがわかります。 (3行目はコントローラーに由来します)。
私はローカルで偽装するには、次のコードを使用すると、それが正常に動作します:
var wid = User.Identity as System.Security.Principal.WindowsIdentity;
if (wid != null)
{
using (var ctx = wid.Impersonate())
{
//Do something
}
}
しかし、私は全体の要求寿命を偽装したいです。 どうすればいいですか?
バックエンドサービスはWindows認証を使用しており、設定で何も変更できません。それに加えて、バックエンドサービスはWindows認証で偽装されたSQL Serverにアクセスしているため、問題を解決するだけです。それで私はそこで私の問題を解決しなければなりません。 – Jaap
[this](http://www.syfuhs.net/post/2010/09/09/Converting-Claims-to-Windows-Tokens-and-User-Impersonation.aspx)のようなものはどうですか? ASP.NETアプリケーションは、バックエンドサービスを呼び出す特定のコードブロックに対してWindowsPrincipalを偽装することができます。 –
PostAuthenticateRequestイベントで偽装して、要求全体をその偽装されたコンテキストで実行できるようにします。 PostAuthenticationRequestの呼び出しを偽装した後、WindowsIdentity.GetCurrent()。Nameは実際に予想されるユーザー名を返します。しかし私のコントローラでは、その後、EndRequestでは、NetworkServiceアカウントが再度設定されます。そして、impersonatingcontext.Undo()! – Jaap