Trudny / egzaminacyjny · lekcja 14
Logowanie i autoryzacja — ASP.NET Core Identity
Prawie każda poważna aplikacja webowa rozróżnia użytkowników — gość, zalogowany użytkownik, administrator. Pisanie własnego systemu logowania od zera (hashowanie haseł, blokowanie po kilku nieudanych próbach, resetowanie hasła) jest trudne i pełne pułapek bezp...
Zacznij tutaj
Po co się tego uczymy?
Wprowadzenie
Teoria
ASP.NET Core Identity to gotowy framework do zarządzania kontami użytkowników, wbudowany w ASP.NET Core — dostarcza tabele bazy danych (użytkownicy, role, hasła w bezpiecznej, zahashowanej formie), gotowe strony logowania/rejestracji, oraz mechanizm ciasteczek uwierzytelniających (opartych o te same podstawy co sesje z poprzedniej lekcji). Dodaje się go do projektu przez builder.Services.AddDefaultIdentity<IdentityUser>().AddEntityFrameworkStores<NazwaDbContext>() — Identity WYMAGA bazy danych (Entity Framework Core, pełne omówienie w lekcji 15) do przechowywania kont.
Nigdy nie przechowuj haseł w czystym tekście. Kluczowa zasada bezpieczeństwa: hasła NIGDY nie są zapisywane w bazie danych "jak są" — Identity automatycznie je haszuje (nieodwracalne przekształcenie matematyczne) przed zapisem. Przy logowaniu, wpisane hasło jest haszowane TĄ SAMĄ funkcją i porównywane z zapisanym hashem — jeśli hashe się zgadzają, hasło było poprawne. Nikt (nawet administrator bazy danych) nie jest w stanie odczytać oryginalnego hasła z bazy, tylko sprawdzić, czy podane hasło do niego pasuje.
Kluczowe klasy i atrybuty:
| Element | Rola |
|---|---|
UserManager<IdentityUser> | zarządzanie kontami: tworzenie, wyszukiwanie, zmiana hasła — wstrzykiwane przez Dependency Injection |
SignInManager<IdentityUser> | obsługa procesu logowania/wylogowania (tworzenie i usuwanie ciasteczka uwierzytelniającego) |
[Authorize] | atrybut na stronie/kontrolerze — BLOKUJE dostęp dla niezalogowanych użytkowników (przekierowanie na stronę logowania) |
[Authorize(Roles = "Admin")] | wariant wymagający KONKRETNEJ roli, nie tylko samego zalogowania |
[AllowAnonymous] | jawnie zezwala na dostęp BEZ logowania (przydatne np. gdy cały kontroler ma [Authorize], ale jedna akcja ma być publiczna) |
User.Identity.IsAuthenticated | sprawdzenie w widoku/kodzie, czy bieżący użytkownik jest zalogowany |
Proces rejestracji. await _userManager.CreateAsync(nowyUzytkownik, haslo) tworzy konto — Identity samo sprawdza wbudowane reguły siły hasła (minimalna długość, wymagane cyfry/znaki specjalne — konfigurowalne) i zwraca IdentityResult z ewentualną listą błędów, jeśli hasło jest za słabe albo e-mail już istnieje.
Proces logowania. await _signInManager.PasswordSignInAsync(email, haslo, zapamietaj: true, lockoutOnFailure: true) sprawdza dane logowania i, jeśli poprawne, tworzy ciasteczko uwierzytelniające. lockoutOnFailure: true włącza AUTOMATYCZNE blokowanie konta po kilku nieudanych próbach logowania z rzędu — ważne zabezpieczenie przed atakiem brute-force (próbowaniem wielu haseł po kolei).
Zobacz zależności
Schemat
Rejestracja:
Formularz (Email, Hasło) → POST
│
▼
_userManager.CreateAsync(nowyUzytkownik, haslo)
│
├── hasło zbyt słabe / e-mail zajęty → błędy walidacji
└── sukces → konto zapisane w bazie (hasło ZAHASZOWANE)
Logowanie:
Formularz (Email, Hasło) → POST
│
▼
_signInManager.PasswordSignInAsync(email, haslo, ...)
│
├── niepoprawne dane / konto zablokowane → komunikat błędu
└── sukces → ciasteczko uwierzytelniające ustawione
Kolejne żądania:
Strona z [Authorize]
│
niezalogowany ──► przekierowanie na /Identity/Account/Login
│
zalogowany ──► dostęp dozwolony, User.Identity.IsAuthenticated == true
Połącz z praktyką
Przykład z życia
Panel klienta w sklepie internetowym (historia zamówień, dane dostawy) jest dostępny WYŁĄCZNIE po zalogowaniu, a panel administracyjny zarządzania produktami wymaga dodatkowo roli "Admin" — dokładnie ten wzorzec (logowanie + role) realizuje ASP.NET Core Identity, zwalniając programistę z konieczności ręcznego pisania bezpiecznego systemu haseł od zera.