Modul 7 - Lekcija 2
Implementacija procesa Prijave, Lockout mehanizma i Role-Based autorizacije
⏱️ Trajanje: ~3.5 časa | 📚 Nivo: Srednji/Napredni | 🎯 Praktični primjeri: 5
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);
}
SignInManager provjerava bazu, logično poredi Hashirane lozinke i kod pronalaska Izdaje šifrirani Auth Cookie.
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).
[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);
}
}
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(); }
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());
}
}
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!
UserManager komponente formiranje strukture, enkripcija pasworda i
dodjeljivanje bazične Rolske uloge registraciji skraćeno je na par jednostavnih paralelnih
Linija C#.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.