Sesje i logowanie 1. Wprowadzenie Żądania od nawet tego samego użytkownika na serwerze nie są domyślnie w żaden sposób łączone ze sobą. Każde jest w pewnym sensie nowe i serwer nie jest w stanie stwierdzić, czy dany klient już z nim wcześniej się łączył. Aby wprowadzić do komunikacji informacje nietracone pomiędzy żądaniami, stosuje się dwie metody: Ciasteczka są to dane przetrzymywane po stronie przeglądarki. Podpinane są pod adres hosta i każdorazowo wysyłane w nagłówku. Zmieniać mogą je obie strony klient i serwer, ale trzymane są po stronie przeglądarki dopóki nie wygasną. Są jawne, widoczne u klienta i w pewnym sensie niebezpieczne. Każde ciasteczko ma wyznaczoną datę wygaśnięcia (po której zostanie skasowane) lub może być tymczasowe do wyłączenia przeglądarki lub karty. Sesje jest to stan, z którym związane jest przetrzymywanie danych, ale po stronie serwera. Logowanie Sesja jest identyfikowana najczęściej poprzez ciasteczko, w którym zapisany zostaje id sesji. Serwer odnajduje u siebie odpowiednią sesje po id i dopiero z niej odczytuje lub zapisuje wrażliwe dane, jak np. id użytkownika. Klient nie ma bezpośredniego dostępu do danych sesji, które są niejawne i w pewnym sensie bezpieczne. Sesja w zależności od serwera może zostać stworzona natychmiast lub po pierwszym wpisie do niej, można to stwierdzić podglądając ciasteczka w przeglądarce. Utrata ciasteczka wiąże się z utratą sesji, która nie zostanie skasowana od razu, a dopiero kiedy minie jej czas wygaśnięcia. Z tego wniosek taki, że są dwa czasy wygaśnięcia. Jeden sesji, drugi ciasteczka z id sesji. Z sesjami ściśle związany jest proces logowania. Logowanie polega w skrócie na powiązaniu sesji z konkretnym użytkownikiem, a co za tym idzie korzystania z jego poświadczeń. W trakcie logowania może zostać stworzona nowa sesja lub tylko powiązana z użytkownikiem. Najprościej jeśli użytkownik poda nam poprawny login i hasło, to wystarczy zapamiętać w sesji id użytkownika. Mając id użytkownika, możemy za każdym razem odczytać id i wyszukać użytkownika bez wymagania podania loginu od klienta. Obecnie często stosuje się logowanie poprzez użytkownika facebook-a lub innego powszechnie stosowanego portalu. W tym przypadku sesja również jest tworzona w systemie, jednakże już nie wymaga pełnej wcześniejszej rejestracji użytkownika. Samo logowanie wykorzystuje sesje fb, która zazwyczaj nie wygasa. Rejestracja Aby się zalogować w systemie na jakieś konto należy wpierw je stworzyć. Najczęściej odbywa się
to poprzez rejestrację. Wymaga to podania danych, którymi będzie się sygnował użytkownik oraz loginu i hasła. Problemem jest możliwość tworzenia wielu kont przez złośliwych użytkowników lub boty, które w ten sposób zakłócają normalną pracę serwisu oraz umieszczają złośliwe treści. Najprostszymi sposobami jest wymaganie podania konta poczty e-mail i wysłanie na niego link z kluczem aktywacyjny oraz używania zagadek oraz rysunkowej chapty, która eliminuje boty. Innym sposobem jest rejestracja przez fb, która ma swoje własne techniki, eliminacje botów oraz fikcyjnych złośliwych użytkowników.
1 Model danych Obsługa sesji w MVC jest domyślnie dostępna, jednakże jeśli chcemy korzystać z możliwość uwierzytelniania użytkowników należy dodać zbiór oraz model danych użytkowników do naszej bazy danych. Jest to najprostszy przykład zawierający tylko id, po którym użytkownik będzie identyfikowany w sesji oraz login i hasło. 2 Rejestracja. Mając już model i bazę danych. Należy utworzyć metody służące do rejestracji nowego użytkownika. Tak jak do tej pory utworzono dwie metody pierwsza wyświetla formularz. Druga odbiera dane i tworzy użytkownika. Jest to bardzo prowizoryczna forma rejestracji, w normalnych warunkach nie do przyjęcia. 3. Logowanie. Posiadając już możliwość dodawania użytkowników, możemy dodać metody logowania. W przypadku logowania metoda odbierająca dane z formularza w pierwszej kolejności sprawdza,
czy użytkownik o danym loginie i użytkowniku istnieje w bazie danych. Jeśli tak to przepisuje jego id do sesji. Najprawdopodobniej po tej czynności w waszej przeglądarce pojawi się ciasteczko ze zmienną sesyjną. Dodatkowo można dodać metodę wylogowania, która odłączy użytkownika od sesji. Trzeba pamiętać, iż do zmiennej sesyjnej, można dodać dowolne inne zmienne niż id użytkownika. A więc wylogowując należało by usunąć je wszystkie razem oraz zmusić serwer, aby porzucił tą sesję. 4. Wykorzystanie sesji w kontrolerach Posiadając funkcjonalność logowania, możemy w każdym z kontrolerów sprawdzić na bazie sesji, czy użytkownik jest zalogowany oraz pobrać jego dane. Dodano pole userid oraz user, do którego z bazy i sesji zostaną przypisane dane użytkownika. Pola te będą dostępne w pozostałych metodach kontrolera. Dodano również nadpisanie metody wirtualnej BeginExecute z klasy Controller jest to metoda, która zostanie uruchomiona przed każdą inna metodą-akcją kontrolera. Metoda ta pobiera id użytkownika z sesji, a następnie użytkownika z bazy danych. userid == null brak zalogowania user == null brak zalogowania lub brak takiego użytkownika Tak więc w pozostałych metodach możemy z łatwością ograniczyć dostęp jedynie dla zalogowanych oraz korzystać z danych zalogowanego użytkownika.
Zadanie Rozszerzyć aplikację z poprzednich zajęć i dodać obsługę logowania. Zbadać np. debugując aplikację oraz narzędziami deweloperskimi chroma, jak zachowuje się sesja. Sprawdzić, czy i jak można ukraść sesję na innej przeglądarce. Dodać funkcjonalność aktywacji konta. Po rejestracji, użytkownik ma nie mieć możliwości się zalogować do systemu. Wymagać aktywacji konta poprzez link z kluczem, po kliknięciu w którego zmieni się status konta. (Przy rejestracji przypisać użytkownikowi unikalny klucz aktywacji oraz dodać dodatkową metodę, która przyjmie parametry z kluczem, odszuka użytkownika i zmieni mu status na aktywny.) (opcjonalne do domu) skonfigurować klienta własnej poczty np. gmail, aby za jej pomocą wysyłać link aktywacyjny. Podpowiedź http://stackoverflow.com/questions/20882891/howcan-i-send-email-using-gmail-smtp-in-asp-net-mvc-application. Wiadomość należy wysłać w metodzie rejestracji dodającej nowego użytkownika. Dla przypomnienia, aplikacja ma służyć do zarządzania biblioteką. Podstawową funkcjonalnością jest wyświetlanie i dodawanie książek do katalogu oraz dodawanie do nich autorów. Dodatkowo aplikacja powinna pozwalać wyszukiwać i usuwać pozycje z katalogu.