2011-08-22 10 views
8

Oto interesująca funkcja ASP.NET FormsAuthentication wyjaśniona w tej odpowiedzi SO: How do you pass an authenticated session between app domainsEnableCrossAppRedirects - gdzie udokumentowano funkcję między domenami?

Szybkie podsumowanie; możesz utworzyć dwie witryny ASP.NET z tymi samymi kluczami szyfrowania. Witryna internetowa może tworzyć tokeny formulaauth i przekierowywać do WebsiteB z tokenem w querystring (lub treści POST). Włącz EnableCrossAppRedirects w WebsiteB, a program ASP.NET wykrywa token i tworzy plik cookie typu. W kodzie:

FormsAuthentication.RedirectFromLoginPage("alice", true); 
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket("Alice", true, 30); 
string encrypted = FormsAuthentication.Encrypt(ticket); 
Response.Redirect("http://siteb.dev/Secure/WebForm1.aspx?" + FormsAuthentication.FormsCookieName + "=" + encrypted); 

Brzmi jak wspaniała cecha, ale gdzie jest to udokumentowane? Czułbym się nieswojo używając nieudokumentowanej funkcji.

Gdzie szukałem - brak wzmianki o tej funkcji w żadnym z numerów referencyjnych MSDN. Pomyślałem, że może RedirectFromLoginPage zbuduje przekierowanie jak mój kod powyżej, to nie.

Odpowiedz

14

Spojrzeliśmy na reflektorze jest (nieco nieudokumentowane) cechą form Uwierzytelnianie. Po włączeniu usługi EnableCrossAppRedirects .NET oprócz sprawdzania pliku cookie uwierzytelniania, spróbuje wyodrębnić uwierzytelnianie formularzy "cookie" z pliku formularza lub ciągu zapytania. Ten kod jest osadzony w klasie FormsAuthentication w metodzie ExtractTicketFromCookie, gdzie wyraźnie widać, jak próbuje znaleźć plik cookie uwierzytelniania w danych żądania.

if (FormsAuthentication.EnableCrossAppRedirects) 
{ 
    text = context.Request.QueryString[name]; 
    if (text != null && text.Length > 1) 
    { 
     if (!cookielessTicket && FormsAuthentication.CookieMode == HttpCookieMode.AutoDetect) 
     { 
      cookielessTicket = CookielessHelperClass.UseCookieless(context, true, FormsAuthentication.CookieMode); 
     } 
     try 
     { 
      formsAuthenticationTicket = FormsAuthentication.Decrypt(text); 
     } 
     catch 
     { 
      flag2 = true; 
     } 
     if (formsAuthenticationTicket == null) 
     { 
      flag2 = true; 
     } 
    } 
    if (formsAuthenticationTicket == null || formsAuthenticationTicket.Expired) 
    { 
     text = context.Request.Form[name]; 
     if (text != null && text.Length > 1) 
     { 
      if (!cookielessTicket && FormsAuthentication.CookieMode == HttpCookieMode.AutoDetect) 
      { 
       cookielessTicket = CookielessHelperClass.UseCookieless(context, true, FormsAuthentication.CookieMode); 
      } 
      try 
      { 
       formsAuthenticationTicket = FormsAuthentication.Decrypt(text); 
      } 
      catch 
      { 
       flag2 = true; 
      } 
      if (formsAuthenticationTicket == null) 
      { 
       flag2 = true; 
      } 
     } 
    } 
} 

Dlatego jeśli włączysz EnableCrossAppRedirects na obu aplikacji, a następnie pierwsza aplikacja jest uprawniony do przekierowania na stronę zewnętrzną, a druga aplikacja będzie automatycznie odczytywać cookie uwierzytelniania z żądania. Trzeba go zaprojektować tak, aby adres URL do logowania zwracał dane pliku cookie lub wysyłał je w postaci zapytania. Musisz również upewnić się, że klucze komputera są zsynchronizowane lub że plik cookie jest szyfrowany za pomocą klucza komputera aplikacji zewnętrznej (przez pierwszą aplikację). Domyślnie .NET wyśle ​​zaszyfrowany plik cookie uwierzytelniający w teście zapytania dla ciebie i pod warunkiem, że klucze twojego komputera są zsynchronizowane (patrz cytat MSDN poniżej).

Oto niektóre więcej info on MSDN.

Jeśli właściwość CookiesSupported jest prawdą, a każda zmienna ReturnURL jest w bieżącej aplikacji lub własność EnableCrossAppRedirects jest prawdą, to metoda RedirectFromLoginPage wystawia bilet uwierzytelnienia i umieszcza go w domyślnym pliku cookie za pomocą metoda SetAuthCookie.

Jeśli funkcja CookiesSupported ma wartość false, a ścieżka przekierowania jest adresem URL w bieżącej aplikacji , bilet jest wydawany jako część przekierowania. Jeśli CookiesSupported jest fałszywa, EnableCrossAppRedirects jest prawdą, a adres URL przekierowanie nie odnosi się do strony w bieżącej aplikacji, metoda RedirectFromLoginPage wystawia bilet uwierzytelnienia i miejscach we właściwości kwerendy.

Istnieje duże ostrzeżenie o wpływie na bezpieczeństwo. EnableCrossAppRedirects to ustawienie zabezpieczeń, które uniemożliwia przekierowanie kontrolek logowania ASP.NET do zewnętrznego, zwrotnego adresu URL (innej aplikacji internetowej). Po włączeniu tego ustawienia można go wykorzystać w niektórych formach ataku - użytkownik jest wysyłany na oficjalną stronę logowania, ale po zalogowaniu jest przekierowywany do innej aplikacji, która może być taka sama. Właśnie dlatego jest domyślnie wyłączona.

Jednym ze sposobów, aby pomóc złagodzić ten po włączeniu tej funkcji jest następująca:

Aby zwiększyć bezpieczeństwo podczas korzystania z cross-aplikacja przekierowuje należy zastąpić metodę RedirectFromLoginPage aby umożliwić przekierowuje tylko dozwolonych witryn internetowych .

Należy również upewnić się, że żądanie przekierowania jest podawane za pośrednictwem protokołu SSL w celu ochrony "pliku cookie" podczas przesyłania, ponieważ każdy przechwytujący może uzyskać kontrolę nad kontem.

+0

Przepraszam zmieniona moja odpowiedź, jest ukryta funkcja .NET, która automatycznie odbierze plik cookie uwierzytelniania z formularza lub ciągu zapytania. Nauczyłem się czegoś nowego! – TheCodeKing

+0

Świetna odpowiedź! Więc w pewnym sensie podważam funkcję auth "no cookies". Ponowne zagrożenia bezpieczeństwa: Nie używam RedirectFromLoginPage, więc kontroluję, gdzie użytkownik zostanie przekierowany. Przekierowanie przez SSL - token na POST/querystring jest nie mniej chroniony niż plik cookie formsauth, najbezpieczniejszym zakładem jest umieszczenie całej witryny przez SSL. – russau

+0

BTW - dlaczego wiki społeczności? czy nadal otrzymasz nagrodę, kiedy ją nagrodzę? – russau

Powiązane problemy