MS Learn: aspnet/core/blazor/call-web-api och blazor/security/
Pluralsight: Building Blazor Web Apps in .NET 8 + Securing Blazor Applications(.NET 8-kurser — koncepten gäller i .NET 10; se MS Learn för .NET 10-nyheter)
Lektionens mål
Studenten kan registrera och använda en typad HttpClient.
Studenten kan hantera fel med try/catch och ErrorBoundary.
Studenten kan skydda sidor och delar av UI med AuthorizeView.
Agenda (150 min)
0:00
Check-in.
0:10
Teori: HttpClient i Blazor — AddHttpClient, typed client, GetFromJsonAsync.
Examinations-status. Vem behöver hjälp innan deadline?
2:30
Slut
Talartips per sektion
Typad klient vs anonym: visa båda. Typad är att föredra: dependency-injection-vänlig, testbar, BaseAddress hanteras på ett ställe.
Auth är ett djupt ämne: säg att vi bara gör översikten. Identity har 20+ Razor Pages som genereras — vi går inte in i dem. För djupet finns Pluralsight Securing Blazor.
UI ≠ säkerhet: det här är kursens andra viktiga säkerhetspoäng. AuthorizeView gömmer knappar, men servern måste fortfarande skydda endpoints med [Authorize].
Workshop — guide för läraren
Registrera en typad WeatherClient mot https://api.open-meteo.com.
Bygg en sida som låter användaren ange koordinater och visar temperaturen.
Hantera fel snyggt (visa felmeddelande, inte ett crash).
Skapa ett nytt sidoprojekt med --auth Individual. Demonstrera AuthorizeView och [Authorize].
Skapa ett admin-konto manuellt (via Identity-sidorna) och en skyddad /admin-sida.
// Program.cs
builder.Services.AddHttpClient<WeatherClient>(c =>
c.BaseAddress = new Uri("https://api.open-meteo.com/"));
// WeatherClient.cs
public class WeatherClient(HttpClient http)
{
public async Task<double?> GetTempAsync(double lat, double lon)
{
var resp = await http.GetFromJsonAsync<OpenMeteoResponse>(
$"v1/forecast?latitude={lat}&longitude={lon}¤t=temperature_2m");
return resp?.Current?.Temperature_2m;
}
}
För snabba
Lägg till ErrorBoundary med en reset-knapp.
Bygg ett eget Minimal API (separat projekt) som tjänar produkter och konsumera från Blazor.
För dem som behöver stöd
Förbered en färdig WeatherClient-skelett — låt dem fylla i metoden.
CORS är vanlig fallgrop när man bygger eget API — använd Open-Meteo som inte har CORS-problem.
Vanliga frågor
CORS-fel — hur löser jag det?
På API-sidan: app.UseCors(p => p.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader()) under utveckling. I produktion: lista bara godkända origins.
Skickas cookies med HttpClient i WASM?
Standard ja för same-origin. För cross-origin behöver du sätta BrowserRequestCredentials.Include.
Hur lägger jag till en roll-claim?
I Identity: via UserManager.AddToRoleAsync. Du behöver också ha roller registrerade — använd AddIdentity istället för AddDefaultIdentity eller seed roller via RoleManager.
Min fetch får tillbaka HTML i stället för 401 när användaren är utloggad!
Det är det klassiska problemet med cookie-auth som gör 302-redirect till login. Fixat i .NET 10: endpoints markerade som API returnerar nu 401/403 i stället för redirect. Om du fortfarande sätter upp dig på äldre kod — implementera OnRedirectToLogin i CookieAuthenticationEvents.
Talartips: passkeys
Om någon student frågar om lösenordsfri inloggning — .NET 10 har inbyggt stöd för passkeys (WebAuthn) i Identity. Blazor Web App-mallen med Individual Accounts innehåller scaffolding för det. Bortom kursens scope men en bra tråd för vidare studier.
Säkerhetspoäng
Studenter försöker ofta "skydda" en API-endpoint genom att gömma knappen i Blazor. Säg det rakt ut: UI-skydd är inte säkerhet. Endpoints måste skyddas med [Authorize].
Hemuppgift
Slutför funktionella krav i examinationen. Lägg till auth om du siktar på VG.
Förberedelse till nästa lektion
L8 är sista lektionen och innehåller redovisning. Boka in 10-min-slots för redovisning i förväg. Förbered Azure-konton (testverions) ifall någon vill deploya live på lektionen.