2009-08-06 36 views
8

Mam wewnętrzną aplikację, która ma dwa poziomy zabezpieczeń. Formularze Uwierzytelnianie dla aplikacji skierowanej na klienta i NTLM Zintegrowane uwierzytelnianie dla interfejsu zarządzania.Podszywanie się pod użytkowników za pomocą NTLM

Potrafię łatwo podszyć się pod klienta, tworząc po prostu odpowiedni plik .ASPXAUTH przy użyciu metod klasy FormsAuthentication. Jednak generowanie nagłówka uwierzytelniania HTTP dla NTLM jest jak dotąd poza mną.

Miałem swoje nadzieje, gdy znalazłem ten artykuł (http://msdn.microsoft.com/en-us/library/ms998358.aspx#paght000025_usingimpersonation), ale potem zdałem sobie sprawę, że tworzy on tylko kontekst do uruchomienia kodu na czas trwania żądania. I chciałbym zmienić całą sesję, aby serwer pomyślał, że używam innego logowania do domeny. Posiadam uprawnienia administracyjne na moim koncie, więc nie jest to przeznaczone na przekręcanie lub kradzież haseł do domeny.

Czy to możliwe? Dzięki.

Odpowiedz

7

Powiedzmy, że masz włączone uwierzytelnianie formularzy aplikacji ASP.NET z formularzem logowania login.aspx, a Twoi użytkownicy są zapisani w DB. Teraz chcesz obsługiwać zarówno uwierzytelnianie formularzy, jak i systemu Windows. To właśnie robię:

Dla formularzy auth Używam SQL DB z, powiedzmy, tabelą Users. Dodam do tego tabeli nową kolumnę o nazwie WindowsUserName w którym będę zapisać nazwę użytkownika systemu Windows w formie komputerowej \ użytkownik

W login.aspx formie dodać metodę, która wyśle ​​odpowiedź, która pokazuje okno logowania:

private void ActivateWindowsLogin() 
{ 
    Response.StatusCode = 401; 
    Response.StatusDescription = "Unauthorized"; 
    Response.End(); 
} 

Gdzieś mam link jak <a href="login.aspx?use=windows">Admin</a>

W login.aspx Page_Load Dodałem:

if (Request.QueryString["use"] == "windows") 
{ 
    var windowsuser = Request.ServerVariables["LOGON_USER"]; 
    if (windowsuser.Length == 0) 
     ActivateWindowsLogin(); 
    else 
    { 
     // get userId from DB for Windows user that was authenticated by IIS 
     // I use userId in .ASPXAUTH cookie 
     var userId = GetUserIdForWindowsUser(windowsuser); 
     if (userId > 0) //user found 
     { 
      // here we get User object to check roles or other stuff 
      var user = GetApplicationUser(userId); 
      // perform additional checks here and call ActivateWindowsLogin() 
      // to show login again or redirect to access denied page. 
      // If everythig is OK, set cookie and redirect 
      FormsAuthentication.SetAuthCookie(userId.ToString(), false); 
      Response.Redirect(FormsAuthentication.GetRedirectUrl(userId.ToString(), false), true); 
     } 
     else //user not found 
      ActivateWindowsLogin(); 
    } 
} 
else 
{ 
    //your Forms auth routine 
} 

GetUserIdForWindowsU ser i GetApplicationUser są moimi metodami tylko dla próbki.

+0

Chodzi o to, że dwa schematy uwierzytelnienia regulują dwie różne części strony internetowej i nie mogę ich mieszać. Planuję jednak podzielić je na dwie różne aplikacje. Po zakończeniu - mogę używać formularza AuthCookie, ale nadal sprawdzam poprawność na kontach domeny. –

Powiązane problemy