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?

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 bezpieczeństwa. ASP.NET Core Identity to gotowy, sprawdzony w boju system, który rozwiązuje ten problem — ta lekcja pokazuje jego podstawy: rejestrację, logowanie i ograniczanie dostępu do wybranych stron.

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:

ElementRola
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.IsAuthenticatedsprawdzenie 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.