📖 Uvod u modernu ASP.NET Sigurnost
U klasičnom .NET Frameworku, sigurnost se često konfigurisala kroz masivne Web.config
fajlove i module unutar IIS web servera. U modernom .NET-u (bivši .NET Core), sigurnost
je integrisana u samu srž aplikacije kroz koncept koji nazivamo Middleware Pipeline
(cijev za obradu zahtjeva).
Za sisteme javne uprave, gdje se obrađuju strogo povjerljivi podaci (kao što su JMBG, porezni podaci i medicinski kartoni), duboko razumijevanje ovog pipeline-a je krucijalno kako bi se spriječilo neovlašteno curenje podataka.
🔧 Middleware i Pipeline Arhitektura
Middleware je softverska komponenta (klasa) koja se ugrađuje u aplikacijski pipeline kako bi obrađivala (ili prekidala) HTTP zahtjeve i odgovore. Svaka komponenta odlučuje hoće li proslijediti zahtjev sljedećoj komponenti u nizu, ili će odmah prekinuti obradu i vratiti odgovor (tzv. Short-circuiting).
Kodiranje Pipeline-a u Program.cs
U Program.cs, pomoću app.Use... metoda definišemo middleware pipeline.
Poredak je zakonom propisan: morate znati KO je napravio zahtjev (Autentifikacija)
prije nego što provjerite DA LI ima prava pristupa (Autorizacija).
var builder = WebApplication.CreateBuilder(args);
// ... konfiguracija servisa ...
var app = builder.Build();
// 1. Hvatanje grešaka na samom početku
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts(); // Sigurnosno zaglavlje koje forsira HTTPS
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting(); // Određivanje koji endpoint treba obraditi zahtjev
// --- SIGURNOSNI BLOK ---
// Uvijek ide NAKON UseRouting, a PRIJE UseEndpoints / MapControllerRoute!
app.UseAuthentication(); // Čita Cookie ili JWT Token i postavlja HttpContext.User
app.UseAuthorization(); // Provjerava da li HttpContext.User ima dozvolu [Authorize(Roles="Admin")]
// --- CUSTOM AUDIT MIDDLEWARE ZA JAVNU UPRAVU ---
// Svaka akcija mora biti zapisana!
app.Use(async (context, next) =>
{
var userName = context.User.Identity.IsAuthenticated ? context.User.Identity.Name : "Anonimni";
Log.Information($"Pristup: {userName} na {context.Request.Path}");
await next(); // Proslijedi zahtjev dalje
});
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
🔴 Oprez: Kršenje redoslijeda
Ako postavite app.UseAuthorization() prije app.UseAuthentication(),
aplikacija će sve korisnike smatrati "Anonimnim" (jer još nisu prepoznati) i srušit će ih sa HTTP
401 Unauthorized greškom! Ovo je najčešća početnička greška u .NET sigurnosti.
🛡️ Autentifikacija: Ko si ti?
Postoje dva glavna mehanizma u .NET-u koji se koriste za portale javne uprave:
- Cookie Authentication: Standardni pristup za Web Portale (MVC). Korisnik se prijavi, server mu generiše kriptovani tekstualni fajl (Cookie), koji browser automatski šalje pri svakom novom zahtjevu.
- JWT (JSON Web Token): Koristi se za Web API i komunikaciju između različitih
ministarstava (Machine-to-Machine) ili sa mobilnim aplikacijama. Nema browser sessiona; token se
šalje u
Authorization: Bearerzaglavlju.
// Usluge se obavezno dodaju u 'builder.Services' PRIJE 'builder.Build()'
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options =>
{
options.LoginPath = "/Account/Login"; // Gdje poslati korisnika ako nije prijavljen?
options.AccessDeniedPath = "/Account/AccessDenied"; // Gdje poslati korisnika ako nema ulogu?
options.ExpireTimeSpan = TimeSpan.FromMinutes(30); // Istek sesije
options.SlidingExpiration = true; // Produži sesiju ako je korisnik aktivan
// Anti-XSS zaštita: Cookie ne smije biti dostupan javascriptu
options.Cookie.HttpOnly = true;
// Samo HTTPS konekcija smije nositi ovaj cookie
options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
});
🔑 Autorizacija: Imaš li dozvolu?
Nakon što je korisnik identificiran (npr. "Marija iz Službe PDV-a"), Autorizacija utvrđuje da li ona smije vidjeti podatke koje je zatražila.
ASP.NET nudi Role-based (bazirano na ulogama) i Policy-based (bazirano na politikama) autorizaciju.
[Authorize] // Bilo koji logovani korisnik
public class EmployeeDashboardController : Controller
{
public IActionResult Index()
{
return View();
}
[Authorize(Roles = "SuperAdmin, Direktor")] // SAMO za date uloge
[HttpPost]
public IActionResult BrisiDosije(int id)
{
// ... logika ...
return RedirectToAction("Index");
}
}
💾 Sigurnost Baze Podataka (EF Core i SQL Injection)
Bilo koji moderni web sistem oslanja se na Entity Framework Core (EF Core) za komunikaciju sa bazom podataka. Jedna od najvećih prijetnji informacijskim sistemima je SQL Injection (SQLi) - napad gdje haker ubacuje zlonamjerni SQL kôd putem web formi kako bi izbrisao ili preuzeo kontrolu nad bazom podataka.
Dobra vijest: EF Core je podrazumijevano imun na klasične SQL Injection napade! On koristi parameterized queries (parametrizovane upite). Sistem automatski odvaja strukturu SQL komande od samih korisničkih podataka.
// OPASNO (ADO.NET bez parametara):
// Ako je unos korisnika: "105 OR 1=1; DROP TABLE Employees;--"
string query = "SELECT * FROM Employees WHERE Jmbg = " + userInput;
// OVO BI UNIŠTILO BAZU!
// SIGURNO (EF Core):
// EF Core prevodi ovo u parametrized SQL, zlonamjerni tekst ostaje samo tekst
var employee = db.Employees.FirstOrDefault(e => e.Jmbg == userInput);
// SIGURNO
✅ Zaključak
🏛️ Checklist za sigurnost javne uprave
- 1. Pobrinite se da su
UseAuthenticationiUseAuthorizationuvijek između Routinga i Endpoints-a. - 2. Cookie konfiguracija mora imati uključeno
HttpOnlyiSecurePolicy. - 3. Koristite isključivo LINQ (EF Core) umjesto čistih string SQL upita kako biste obezbijedili zaštitu protiv SQL Injection-a.
- 4. Svaka kritična akcija zapisivanja ili brisanja treba imati vlastito Middleware logovanje (Audit).