MODUL 9 - LEKCIJA 2

Sigurnost, Middleware i EF Core

Arhitektura modernog .NET-a: Pipeline, Autentifikacija i Autorizacija

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

📖 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).

HTTP Request Exception Handler Authentication (Ko si ti?) Authorization (Imaš li prava?) MVC Controller HTTP Response Redoslijed izvšavanja je kritičan!

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).

🛠️ Middleware Pipeline (Program.cs)
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:

🛠️ Konfiguracija Cookie Autentifikacije
// 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.

🛠️ Role-Based Autorizacija nad Kontrolerom
[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.

🛠️ EF Core vs SQL Injection
// 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 UseAuthentication i UseAuthorization uvijek između Routinga i Endpoints-a.
  • 2. Cookie konfiguracija mora imati uključeno HttpOnly i SecurePolicy.
  • 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).