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ć?
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
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. –
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