2011-11-29 16 views
9

Ostatnio miałem trochę problemów z miejscem na AppHarbor którym pisałem o ich forach wsparcia: Request.IsSecureConnection always returns falsesłabnącym ciasteczka jako „bezpieczne” w formach auth gdy strona jest za równoważenia obciążenia obsługującego cert TLS

W skrócie, ponieważ system równoważenia obciążenia deszyfruje ruch HTTPS, zanim trafi on do aplikacji internetowej, atrybuty takie jak Request.IsSecureConnection i konfiguracja taka jak requireSSL w formularzu auth nie zachowuje się zgodnie z oczekiwaniami. W rzeczywistości w tym drugim przypadku nie można nawet uwierzytelnić, ponieważ aplikacja uważa, że ​​żądanie nie przychodzi za pośrednictwem protokołu HTTPS.

Jest to forma auth, która jest szczególnie problematyczna, ponieważ bez niej pliki cookie nie są ustawione na "bezpieczne" i są wysyłane za pośrednictwem protokołu HTTP, jeśli witryna jest dostępna tylko według nazwy domeny i domyślnie wyświetla niezabezpieczony schemat URL.

Jaki byłby najlepszy sposób obejścia tego problemu? Wolałbym wykorzystać natywną konfigurację zabezpieczeń, czy ktoś może zobaczyć sposób na zastąpienie implementacji, która sprawdza, czy połączenie jest bezpieczne? Jest to dość łatwe do wykrycia, czy wniosek został doręczony przez HTTPS (zarówno na podstawie Request.Url.Scheme lub nagłówku X_FORWARDED_FOR), to tylko kwestia starannie wiążąc to z.

+0

IsSecureConnection sprawdza tylko czy adres URL zaczyna się od https: // (a nie od http: //) – Aristos

+0

Czy jesteś tego pewien? Wydaje się, że jest jeszcze więcej w oparciu o reakcję w App Harbor i innych ludziach doświadczających podobnych problemów w tych samych okolicznościach w innych zrównoważonych scenariuszach obciążenia. Rozumiem, że sprawdza, czy połączenie korzysta z bezpiecznych gniazd, ale to nie jest zależne od tego, czy schemat URL jest HTTPS, stąd problem. –

+0

Ostatni raz sprawdzam to z NetReflectorem i widzę kod "IsSecureConnection", który sprawdza się tylko wtedy, gdy URL zaczyna się od https: // Jeśli możesz uruchomić NetReflector, znajdziesz funkcję i sprawdzisz ją samodzielnie. – Aristos

Odpowiedz

4

wyłączyć ustawienie requiressl i dodaj następujący kod do swojej aplikacji . To powinno zabezpieczyć twoje pliki cookie uwierzytelniania/sesji.

void Application_EndRequest(object sender, EventArgs e) 
{ 
    if (Response.Cookies.Count > 0) 
    { 
     foreach (string s in Response.Cookies.AllKeys) 
     { 
      if (s == FormsAuthentication.FormsCookieName || s.ToLower() == "asp.net_sessionid") 
      { 
       Response.Cookies[s].Secure = true; 
      } 
     } 
    } 
} 
+0

Dopuszczenie, aby plik cookie przechodził przez HTTP w ogóle, nie zapewniałoby bezpieczeństwa. Ponieważ 'Response.Cookies.Count> 0' nie jest konieczne z' foreach', skończyło się zamianą go na '! Request.IsLocal' i wstawieniem' Response.Cookies [s] .HttpOnly = false; 'do uniemożliwić wysyłanie go przez przewód w postaci zwykłego tekstu (ale pozostaw to otwarte dla lokalnego testowania dev). – patridge

+0

HttpOnly = false TO NIEPRAWIDŁOWA FLAGA (kontroluje, czy plik cookie jest dostępny dla Javascript i nie ma nic wspólnego z typem połączenia). –

5

Alternatywnie, można użyć modułu URL przepisywania oszukać ASP.NET do myślenia, że ​​jest uruchomiony pod kontekście HTTPS i opuścić flagi requiressl w miejscu (co oznacza, że ​​ciasteczka będą ustawione jako bezpieczne - i dostępny tylko wtedy, gdy naprawdę są uruchomione w HTTPS)

można ustawić następujące w Twojej web.config:

<rewrite> 
     <rules> 
      <rule name="HTTPS_AlwaysOn" patternSyntax="Wildcard"> 
       <match url="*" /> 
       <serverVariables> 
        <set name="HTTPS" value="on" /> 
       </serverVariables> 
       <action type="None" /> 
      </rule> 
     </rules> 
    </rewrite> 

trzeba także dodać HTTPS do listy allowedServerVariables w applicationHost.config (lub przez przepisać URL config)

 <rewrite> 
      <allowedServerVariables> 
       <add name="HTTPS" /> 
      </allowedServerVariables> 
     </rewrite> 

Z podziękowaniami dla Levi Broderick w zespole ASP.NET, który wysłał mnie we właściwym kierunku, aby to rozwiązanie!

Powiązane problemy