2012-02-02 23 views
5

Mam ASP.NET application, który używa uwierzytelniania baz danych poświadczeń przeciwko ADFS. Również mapuję go do WindowsClaimsIdentity, korzystając z roszczeń do usługi tożsamości w systemie Windows. To działa dobrze.Podszywanie tożsamości roszczeń ASP.NET do tożsamości systemu Windows

Ale teraz muszę podszyć się pod bieżące żądanie/wątek, aby uzyskać dostęp do usługi, która nie jest świadoma. Jak mam to zrobić?

Mam nabył WindowsImpersonationContext w przypadku Application_PostAuthenticate i zapisać, że w HttpContext.Items a następnie w zaproszeniu Application_EndRequest metodę anulowania?

Czy są inne preferowane sposoby na zrobienie tego?

Aktualizacja: Ponieważ nie otrzymałem żadnych wskazówek co do preferowanego sposobu podszywania się, próbowałem własnej sugestii. Stworzyłem ten kod w Global.asax.cs:

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); 
     } 
    } 

Kiedy patrzę w dzienniku śledzenia widzę ten

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 

Więc w drugim wierszu widać nić wcieliła się poprawnie. Ale w następnych wierszach widać, że podszywanie się jest stracone. (trzecia linia pochodzi od kontrolera).

Gdy używam następujący kod do podszywania lokalnie działa dobrze:

 var wid = User.Identity as System.Security.Principal.WindowsIdentity; 
     if (wid != null) 
     { 
      using (var ctx = wid.Impersonate()) 
      { 
       //Do something 
      } 
     } 

Ale chcę udawać całe żądania żywotność. Jak mam to zrobić?

Odpowiedz

1

Powiedziałeś, że usługa backendu nie jest świadoma roszczeń. Czy możesz to rozwinąć? Czy masz na myśli, że skompilowany kod nie jest świadomy roszczeń, ale masz możliwość modyfikowania pliku web.config? Jeśli tak, to możesz spróbować skonfigurować usługę backendu, aby używała potoku WIF do uwierzytelniania przez zaklinowanie w module uwierzytelniania WSFederationAuthenticationModule, SessionAuthenticationModule i niestandardowym ClaimsAuthorizationManager, jeśli musisz także zrobić authZ. Następnie możesz użyć funkcji WF ActAs lub OnBehalfOf, gdy twoja aplikacja ASP.NET wywołuje usługę backendu.

+0

Usługa backendu używa uwierzytelniania systemu Windows i nie mogę zmienić niczego w jego konfiguracji. Poza tym, tylko poruszyłoby to problem, ponieważ ta usługa backendu uzyskiwała dostęp do SQL-Server z podszytym uwierzytelnianiem Windows. Więc wtedy będę musiał rozwiązać mój problem. – Jaap

+0

Co z czymś takim jak [this] (http://www.syfuhs.net/post/2010/09/09/Converting-Claims-to-Windows-Tokens-and-User-Impersonation.aspx)? Twoja aplikacja ASP.NET może podszywać się pod WindowsPrincipal dla pewnych bloków kodu, w których wywołuje usługę backendu. –

+0

Chcę podszywać się pod zdarzenie PostAuthenticateRequest, aby cała prośba mogła działać w tym podszytym kontekście. Po podszywaniu się pod Call w PostAuthenticationRequest WindowsIdentity.GetCurrent(). Nazwa zwraca rzeczywiście oczekiwaną nazwę użytkownika. Ale w moim kontrolerze, a potem w EndRequest ma ponownie konto NetworkService. I nie wykonano impersonatingcontext.Undo()! – Jaap

-1

Niestety na wykopaniu ten stary wątek, ale Twój kod do pracy upewnij się, że Zarządzane Pipeline Tryb Application Pool uruchomiona aplikacja jest ustawiona na Klasyczny.

Powiązane problemy