Registracija, Prijava i Autorizacija

Modul 7 - Lekcija 2

Implementacija procesa Prijave, Lockout mehanizma i Role-Based autorizacije

⏱️ Trajanje: ~3.5 časa | 📚 Nivo: Srednji/Napredni | 🎯 Praktični primjeri: 5

📖 Registracija Novih Korisnika (Signup)

Ovaj primjer prikazuje kreiranje korisnika uz pomoć kreiranog UserManager-a iz Modela, uz automatsku dodjelu početne uloge.

[HttpPost]
[AllowAnonymous] // Konekcija na ovu metodu bez Login-a.
[ValidateAntiForgeryToken] // CSRF Zaštita
public async Task<ActionResult> Register(RegisterViewModel model)
{
    if (ModelState.IsValid)
    {
        var user = new ApplicationUser { UserName = model.Email, Email = model.Email, Ime = model.Ime };
        
        // Identity OVDE u pozadini vrši sigurno Salt Hashiranje zaprimljene lozinke! NIKAD plain text.
        var result = await UserManager.CreateAsync(user, model.Password);
        
        if (result.Succeeded)
        {
            await UserManager.AddToRoleAsync(user.Id, "Sluzbenik");
            await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
            return RedirectToAction("Index", "Pocetna");
        }
        AddErrors(result); // Identity vraća popis grešaka za ViewModel Summary!
    }
    return View(model);
}

🔐 Sistem Prijave sa Lockout Zaštitom (Login)

SignInManager provjerava bazu, logično poredi Hashirane lozinke i kod pronalaska Izdaje šifrirani Auth Cookie.

Mogućnost: shouldLockout: true

Ukoliko aktivirate navedeni parametar Identity nakon 5 pogrešnih pokušaja privremeno Locka-Account (bana) na nekoliko minuta kako bi odbili sve softvere na svijetu programirane da milion puta svake sekude pokušavaju unijeti sve varijante poznate lozinke! (Brute-Force napad).

🔐 Primjer Sigurnog Logina iz Kontrolera

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
    if (!ModelState.IsValid) return View(model);

    // Kljucni Parametar shouldLockout
    var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: true);
        
    switch (result)
    {
        case SignInStatus.Success:
            return RedirectToLocal(returnUrl); 
            
        case SignInStatus.LockedOut:
            return View("Lockout"); // Zakljucano - prikazujemo taj ekran
            
        case SignInStatus.Failure:
        default:
            // NIKAD ne govorite "Lozinka je pogrešna". Haker tada prepoznaje da Email postoji!
            ModelState.AddModelError("", "Neispravni podaci za prijavu.");
            return View(model);
    }
}

🛡️ Filteri (Autorizacija u praksi)

Sistem Autorizacije u MVC aplikacijama se rješava korištenjem Atributskih Znački koje rade poput skenera pred vratima klase!

// Kontroler zahtijeva obavezno uspješno Auth Kredencijale (SignIn Cookie status) 
[Authorize]
public ActionResult Dashboard() { return View(); }

// [Roles=""] Striktna Autorizacija - Samo odabrani nivo (Zaustavlja niske Officire)
// Provjerava vezu: RoleManager preko Auth Cookie-ja.
[Authorize(Roles = "Administrator")]
public ActionResult MenadzemtnPortala() { return View(); }

// Spajanje Više uloga koje istovremeno svaka ima pravo.
[Authorize(Roles = "Sekretar, Direktor")]
public ActionResult Izvjestavanje() { return View(); }

🌍 Globalna Autorizacija (Najviši sistem sigurnosti)

U javnim upravama nekada je bolje pretpostaviti i definisati da je sve zabranjeno 100% stranice unutar Globalnih parametara Filter Config Tabele kod paljenja Aplikacije umjesto dodavanja hiljadu pojedinačnih znački

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        // ... Ostali
        // Primjenjuje Zaključavanje Aplikacije od Anonimsnih Gledaoca odmah!
        filters.Add(new AuthorizeAttribute()); 
    }
}

Oprez prilikom Lockdown-a:

Kada koristite metodu iznad, nikad ne zaboravite iznad Metode za Login Formu unutar kontrolera pripisati [AllowAnonymous] kako bi i sam posjetioc uopšte se domogao login formulara!

✅ Zaključak

  • ✅ Korištenjem UserManager komponente formiranje strukture, enkripcija pasworda i dodjeljivanje bazične Rolske uloge registraciji skraćeno je na par jednostavnih paralelnih Linija C#.
  • ✅ U Account kontrolerima parametar shouldLockout: true ključna je instrukcija za spas sigurnosti portala od masovnog probijanja pogađanjem šifre.
  • [Authorize(Roles="XYZ")] olakšavaju arhitekti usmjeravanje saobraćaja baziranog isključivo po ovlaštenjima u samim predefinisanim C# klasama umjesto baze.