2012-02-02 18 views
5

私は、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 
      } 
     } 
しかし、私は全体の要求寿命を偽装したいです。 どうすればいいですか?

答えて

1

あなたはバックエンドサービスが請求を認識していないと言いました。これについて詳しく説明できますか?コンパイルされたコードがクレームを認識していないが、web.configファイルを変更できることを意味しますか?もしそうなら、WSFederationAuthenticationModule、SessionAuthenticationModule、およびカスタムのClaimsAuthorizationManagerを使用してauthZのWEDパイプラインを使用するようにバックエンドサービスを設定することもできます。 ASP.NETアプリケーションがバックエンドサービスを呼び出すときは、WIFのActAsまたはOnBehalfOf機能を使用できます。

+0

バックエンドサービスはWindows認証を使用しており、設定で何も変更できません。それに加えて、バックエンドサービスはWindows認証で偽装されたSQL Serverにアクセスしているため、問題を解決するだけです。それで私はそこで私の問題を解決しなければなりません。 – Jaap

+0

[this](http://www.syfuhs.net/post/2010/09/09/Converting-Claims-to-Windows-Tokens-and-User-Impersonation.aspx)のようなものはどうですか? ASP.NETアプリケーションは、バックエンドサービスを呼び出す特定のコードブロックに対してWindowsPrincipalを偽装することができます。 –

+0

PostAuthenticateRequestイベントで偽装して、要求全体をその偽装されたコンテキストで実行できるようにします。 PostAuthenticationRequestの呼び出しを偽装した後、WindowsIdentity.GetCurrent()。Nameは実際に予想されるユーザー名を返します。しかし私のコントローラでは、その後、EndRequestでは、NetworkServiceアカウントが再度設定されます。そして、impersonatingcontext.Undo()! – Jaap

-1

申し訳ありませんが、この古いスレッドを掘り下げても、アプリケーションで動作するアプリケーションプールのマネージパイプラインモードがクラシックに設定されていることを確認してください。