5

Pytanie nr 1: Czy setAuthCookie jest mniej bezpieczny niż FormsAuthentication.Encrypt (ticketVariable)?FormsAuthentication.SetAuthCookie vs FormsAuthentication.Encrypt

Mam na myśli, że jeśli ktoś spróbuje zmodyfikować plik cookie utworzony przez setAuthCookie, modyfikując nazwę użytkownika, przypuszczam, że to naruszy uwierzytelnianie podczas kolejnych połączeń?

Pytanie nr 2: dla osób korzystających z iPhone'ów i tabletów w celu uzyskania dostępu do witryny, przypuszczam, że FormsAuthentication zakończy się niepowodzeniem? Biorąc pod uwagę, że nie chcę używać opcji cookieless, czy istnieje inne podejście, aby strona była bezpieczna zarówno na przeglądarkach smartfonów, jak i na przeglądarkach internetowych?

okrzyki

Odpowiedz

14

SetAuthCookie zasadzie tworzy nowy FormsAuthenticationTicket z dostarczanymi nazwa & opcji utrwalania, serializes go FormsAuthentication.Encrypt() 's go i ustawia go w kolekcji Response.Cookies. SetAuthCookie i GetAuthCookie wywołują pośrednio FormsAuthentication.Encrypt.

Przy kolejnych żądaniach moduł FormsAuthentiation obsługuje zdarzenie AuthenticateRequest. Jeśli zobaczy plik cookie (mógł wygasnąć), próbuje odszyfrować jego wartość za pomocą klucza MachineKey (mogło zostać zmodyfikowane) i przekształcić go z powrotem w formularz FormsAuthenticationTicket (może być uszkodzony). Jeśli nie wystąpi (złe rzeczy), bilet zawiera nazwę użytkownika, datę wydania, informację o wygaśnięciu itd. Jeśli bilet nie wygasł, zostaną utworzone IIdentity i IPrincipal i przypisane do HttpContext.Current.User i Thread. CurrentThread.Principal. W .NET 4.5 i nowszych (jak sądzę) jest to oparte na roszczeniach (ClaimsIdentity, ClaimsPrincipal). Wcześniej był to (GenericPrincipal, FormsIdentity).

Dowolne sabotażowanie po stronie użytkownika spowoduje, że żądanie będzie traktowane jako anonimowe. Nie uda się odszyfrować. Jedynymi rzeczami, które mogłyby zagrozić temu sprawdzeniu, byłyby, gdyby klucz maszynowy w pliku web.config/machine.config w jakiś sposób dostał się w ręce atakującego lub jeśli wystąpił błąd w kodzie kodu (wyszukując Padding Oracle dla historycznego przykładu tego).

Oprócz tego inną rzeczą, na którą trzeba uważać, będzie porwanie sesji. Jeśli na przykład ktoś ukradnie plik cookie na publicznej sieci Wi-Fi, może przedstawić go serwerowi, a serwer będzie zachowywał się tak, jakby to Ty. Zwykle wiąże się to ze sniffingiem ruchu sieciowego. Z tych powodów najlepszą praktyką jest używanie protokołu SSL dla całej witryny i ustawienie pliku cookie tylko na HTTP i bezpieczne (prezentowane tylko przez połączenia https) w pliku web.config/system.web/authorization/forms. HTTP oznacza tylko, że nie będzie dostępny dla JavaScript po stronie klienta. Tylko HTTP i Secure oznacza tylko HTTPS. Będzie działać tylko wtedy, gdy korzystasz z protokołu SSL w całej witrynie.

FormsAuthentication będzie działać poprawnie w przeglądarkach mobilnych. Wymaga po prostu akceptacji plików cookie. O ile mi wiadomo, wszystkie urządzenia mobilne na to pozwolą.

+0

Co się stanie w przypadku wysokiego poziomu sesji, czy AuthCookie zostanie naruszony, jeśli niektóre części mojej strony są publiczne, a niektóre bezpieczne, np. Https (dostępne tylko dla zalogowanych użytkowników). Pytam o to, ponieważ wiem, że po utworzeniu AuthCookie jest ono uruchamiane w każdym połączeniu typu klient-serwer. czy istnieje sposób, aby tego uniknąć na niektórych stronach? Mój plan polega na zarejestrowaniu kroku uwierzytelniania jako filtra w moim app_start; i zrób pewne działania [anonimowe] ... twoje myśli (dzięki za cudowną odpowiedź!) – DotNet98

+0

Możesz użyć opcji Ścieżka w system.web/authorization/forms, aby spowodować, że plik cookie będzie prezentowany tylko dla określonej ścieżki na twoim teren. Niestety, jesteś ograniczony do 1 ścieżki. Więc jeśli masz sekcję witryny, do której chcesz umożliwić anonimowy dostęp i inną, która wymaga uwierzytelnienia/autoryzacji, możesz umieścić wszystkie bezpieczne treści w oddzielnej ścieżce i ograniczyć plik cookie do tej ścieżki.Nadal chciałbyś ustawić go jako bezpieczny i tylko http. Ścieżka cookie to najbardziej niezawodny sposób, aby upewnić się, że Twój plik cookie nie porusza się po czystym kanale. – scottt732

+0

tak, wygląda na to, że https jest drogą do zrobienia. Chyba mogę mieć strony https bez uwierzytelniania użytkownika; Zakładam, że będzie to miało wpływ na wydajność, biorąc pod uwagę naturę https. Czy rzucisz trochę światła na to, co się stanie z moimi połączeniami AJAX? czy będę musiał zrobić coś konkretnego, aby chronić moje połączenia Ajax (czy AuthCookie będzie podróżował wraz z moimi wywołaniami ajax)? – DotNet98

Powiązane problemy