Does ASP NET Core web API support authentication?

Sikkerhed i ASP.NET Core Web API: Autentifikation med JWT & API-nøgler

22/05/2025

Rating: 4.6 (12319 votes)

I den digitale tidsalder er sikkerheden af dine API'er ikke blot en fordel, men en absolut nødvendighed. Uanset om du bygger en webapplikation, en mobilapp eller et hvilket som helst system, der kommunikerer over internettet, er det altafgørende at sikre dine API-endpoints. En af de mest fundamentale søjler inden for API-sikkerhed er autentifikation, processen med at bekræfte en brugers identitet. ASP.NET Core Web API tilbyder et væld af kraftfulde og fleksible værktøjer til at håndtere netop dette. Denne artikel vil guide dig gennem implementering af to almindeligt anvendte autentifikationsmetoder: JSON Web Tokens (JWT) og API-nøgler, og vise dig, hvordan du kan udnytte ASP.NET Core Identity til effektiv brugerstyring.

What is token-based authentication in ASP NET Web API?
Token-based authentication is a widely-used approach that can help you achieve this goal. In this detailed guide, we’ll walk you through the step-by-step process of implementing token-based authentication in your ASP.NET Web API.
Indholdsfortegnelse

Autentifikation vs. Autorisation: Forstå Forskellen

Før vi dykker ned i de tekniske detaljer, er det vigtigt at klargøre to ofte forvekslede begreber: autentifikation og autorisation. Selvom de begge er afgørende for sikkerheden, dækker de over forskellige aspekter:

  • Autentifikation handler om at bevise, hvem du er. Det er processen med at verificere en brugers identitet. Tænk på det som at vise dit ID-kort for at komme ind i en bygning.
  • Autorisation handler om, hvad du må gøre, når din identitet er bekræftet. Det er processen med at bestemme, hvilke ressourcer eller handlinger en autentificeret bruger har adgang til. Efter at have vist dit ID-kort, handler autorisation om, hvilke rum du må komme ind i, eller hvilke døre du må åbne.

I ASP.NET Core Web API spiller begge dele en afgørende rolle. Autentifikationen etablerer brugerens identitet, hvorefter autorisationen bygger videre på denne identitet for at håndhæve adgangskontrol. En API kan for eksempel kræve autentifikation for alle anmodninger, men derefter bruge autorisation til at tillade kun administratorer at oprette nye ressourcer, mens almindelige brugere kun kan læse dem. Standardprincippet i ASP.NET Core er, at autentifikationen typisk sker tidligere i anmodnings-pipelinen (via middleware eller meddelelseshandlere), og når en bruger er autentificeret, oprettes en Principal (en IPrincipal-objekt), der repræsenterer brugerens sikkerhedskontekst. Denne Principal indeholder et Identity-objekt, som bekræfter, om brugeren er autentificeret (IsAuthenticated er sand) og ofte også information om brugerens claims eller roller. Dette Principal-objekt er derefter tilgængeligt i hele anmodningens levetid, hvilket gør det muligt at træffe autorisationsbeslutninger.

Her er en hurtig oversigt over forskellene:

AspektAutentifikationAutorisation
FormålAt verificere identitetAt bestemme adgangsrettigheder
Hvornår sker det?Første skridt i sikkerhedsprocessenEfter autentifikation
EksempelLogin med brugernavn/adgangskodeAdgang til specifikke ressourcer baseret på rolle

ASP.NET Core Identity for Brugerstyring

Når du skal administrere brugerkonti og deres loginoplysninger i din egen database, er ASP.NET Core Identity en uundværlig ressource. Det er et API, der tilbyder en omfattende løsning til autentifikation og brugeradministration, designet til at integrere problemfrit med Entity Framework, som er et populært ORM (Object-Relational Mapper) i .NET-økosystemet.

Fordele ved ASP.NET Core Identity

Identity er mere end blot en brugerdatabase. Det håndterer komplekse opgaver som:

  • Sikker hashing af adgangskoder.
  • Understøttelse af to-faktor autentifikation.
  • Administration af brugerroller.
  • E-mailbekræftelse og adgangskodegendannelse.
  • Integration med eksterne login-udbydere som Google og Facebook.

For en Web API, hvor du måske ikke har brug for alle disse funktioner direkte, kan du stadig drage fordel af dens robuste brugerstyringsfunktioner, især når det kommer til sikker lagring og validering af brugeroplysninger.

Installation af Nødvendige NuGet-pakker

For at komme i gang skal du installere to centrale NuGet-pakker i dit projekt:

  • Microsoft.AspNetCore.Identity: Kernbiblioteket, der indeholder de grundlæggende Identity-klasser.
  • Microsoft.AspNetCore.Identity.EntityFrameworkCore: Indeholder de klasser, Identity har brug for til at interagere korrekt med Entity Framework, som bruges til databaseadgang.

Disse pakker tilføjer de nødvendige referencer til dit projekt, så du kan begynde at integrere Identity.

Konfiguration af DbContext

Næste skridt er at opdatere din DbContext-klasse (f.eks. VehicleQuotesContext) til at inkludere de nye tabeller, som Identity-biblioteket kræver. I stedet for at arve fra DbContext, skal din klasse nu arve fra IdentityUserContext<IdentityUser>.

IdentityUserContext er en klasse fra ASP.NET Core Identity, der er designet til at udvide din DbContext med brugerstyringsfunktionalitet. Den tilføjer automatisk en ny DbSet (og dermed en tabel) til lagring af brugerkonti, typisk kaldet AspNetUsers. Den generiske typeparameter, IdentityUser, er en standard Entity Type for din brugermodel. Hvis du har brug for yderligere felter i din brugertabel, kan du oprette en ny klasse, der arver fra IdentityUser, tilføje dine egne felter, og derefter bruge denne brugerdefinerede klasse som typeparameter til IdentityUserContext.

Det er også vigtigt at kalde base.OnModelCreating(modelBuilder); i din DbContext's OnModelCreating-metode, så Identity kan opsætte sig korrekt.

Anvendelse af Database-migrationer

Efter at have opdateret din DbContext skal du oprette og anvende en database-migration. Dette vil sikre, at de nye Identity-tabeller (som AspNetUsers) bliver tilføjet til din database. Ved at køre dotnet ef migrations add AddIdentityTables oprettes migrationsfilen, og dotnet ef database update anvender ændringerne til databasen. Herefter vil du se de nye Identity-relaterede tabeller, klar til at gemme dine brugerdata.

Konfiguration af Identity-tjenester

For at ASP.NET Core kan genkende og bruge Identity-systemet, skal du konfigurere dets tjenester i din applikations Startup.cs-fils ConfigureServices-metode. Her skal du tilføje AddIdentityCore, som gør flere Identity-hjælpeklasser tilgængelige via Dependency Injection. Blandt disse er UserManager, som er en central klasse til at oprette, hente og validere brugere.

What is authorization in ASP NET Web API?
Authorization is deciding whether a user is allowed to perform an action. For example, Alice has permission to get a resource but not create a resource. The first article in the series gives a general overview of authentication and authorization in ASP.NET Web API. Other topics describe common authentication scenarios for Web API.

I AddIdentityCore kan du også konfigurere forskellige indstillinger for brugerkonti, såsom krav til adgangskodens kompleksitet (længde, brug af tal, specialtegn osv.) og om e-mailbekræftelse er påkrævet. Derefter skal du kalde AddEntityFrameworkStores<VehicleQuotesContext>() for at fortælle Identity-systemet, at det skal bruge din VehicleQuotesContext til datalagring.

Oprettelse og Hentning af Brugere

Med Identity-tjenesterne konfigureret kan du nu programmatisk interagere med brugerkonti. Ved at injicere UserManager<IdentityUser> i dine controllere kan du nemt udføre operationer som at oprette nye brugere med CreateAsync-metoden og finde eksisterende brugere med FindByNameAsync. UserManager håndterer automatisk hashing af adgangskoder, hvilket er afgørende for sikkerheden, og giver dig resultater, der indikerer, om operationen lykkedes, samt eventuelle fejl.

Implementering af JWT Bearer Token Autentifikation

JWT (JSON Web Token) er en populær, standardbaseret metode til at repræsentere sikker information mellem to parter. I en Web API-kontekst bruges JWT typisk til at oprette kortlivede tokens, som klienter kan bruge til at autentificere efterfølgende anmodninger, efter de er logget ind med deres loginoplysninger.

Processen for JWT-autentifikation

Den grundlæggende proces er som følger:

  1. Klienten sender loginoplysninger (brugernavn og adgangskode) til et specifikt API-endpoint (f.eks. /api/Users/BearerToken).
  2. API'en validerer loginoplysningerne.
  3. Hvis valideringen lykkes, genererer API'en et JWT og returnerer det til klienten.
  4. Klienten gemmer tokenet sikkert.
  5. For efterfølgende anmodninger til beskyttede endpoints inkluderer klienten JWT'en i Authorization-headeren, typisk som Bearer <token>.
  6. API'en validerer det modtagne JWT ved hver anmodning for at sikre, at det er gyldigt, ikke udløbet, og signeret korrekt.

Generering af Tokens

For at generere JWT'er skal du definere nogle konfigurationsværdier i din appsettings.json-fil, såsom en hemmelig nøgle (Key), Issuer (udstederen af tokenet), Audience (den tilsigtede modtager af tokenet) og Subject. Disse værdier er afgørende for sikkerheden og valideringen af tokenet.

En dedikeret tjenesteklasse, f.eks. JwtService, kan indkapsle logikken for token-generering. Kernen i denne logik er brugen af JwtSecurityToken-klassen fra System.IdentityModel.Tokens.Jwt. Når du opretter en JwtSecurityToken, skal du inkludere:

  • Claims: Dette er udsagn om den entitet, som tokenet er genereret for (f.eks. bruger-ID, brugernavn, e-mail, roller). Claims er ikke krypterede, kun signerede, så de bør ikke indeholde følsomme data.
  • Udløbsdato: JWT'er bør være kortlivede for at minimere risikoen, hvis de bliver kompromitterede.
  • Signeringsoplysninger: Dette er et kryptografisk signatur, der beviser tokenets integritet og autenticitet. Det involverer typisk en symmetrisk sikkerhedsnøgle (din Jwt:Key fra appsettings.json) og en algoritme som HMACSHA256.

Efter at have oprettet JwtSecurityToken, kan en JwtSecurityTokenHandler bruges til at serialisere tokenet til en streng, som kan returneres til klienten.

Sikring af Endpoints med JWT Autentifikation

For at beskytte et endpoint med JWT-autentifikation er der to hovedtrin:

  1. Anvend [Authorize]-attributten: Ved at tilføje [Authorize]-attributten til en controller eller en specifik action-metode signalerer du til ASP.NET Core, at dette endpoint kræver autentifikation. Hvis en uautentificeret anmodning rammer et beskyttet endpoint, vil API'en returnere en HTTP 401 (Unauthorized) statuskode.
  2. Konfigurer JWT Autentifikation: Du skal fortælle ASP.NET Core, hvordan det skal validere indgående JWT'er. Dette gøres i Startup.cs's ConfigureServices-metode ved at kalde AddAuthentication og derefter AddJwtBearer. Inde i AddJwtBearer-konfigurationen angiver du TokenValidationParameters. Her kan du specificere, at udstederen, publikum, levetiden og signeringsnøglen skal valideres mod de værdier, du har defineret i appsettings.json. Endelig skal du sørge for at aktivere autentifikations-middleware'en ved at kalde app.UseAuthentication() i Configure-metoden før app.UseAuthorization().

Når dette er sat op, vil ASP.NET Core automatisk validere JWT'en i Authorization-headeren for hver anmodning til et beskyttet endpoint og afgøre, om brugeren er autentificeret.

Implementering af API Nøgle Autentifikation

API-nøgler er en enklere, men stadig effektiv, autentifikationsmetode, især for maskine-til-maskine-kommunikation eller for adgang til specifikke tjenester. Kernen i API-nøgler er, at API-udbyderen genererer en hemmelig streng (nøglen) og giver den til klienten. Klienten inkluderer derefter denne nøgle i hver anmodning, typisk via en brugerdefineret HTTP-header.

Forskelle fra JWT

I modsætning til JWT'er, som typisk er kortlivede og signerede for at bevise integritet, er API-nøgler ofte længerevarende og gemmes direkte i databasen. Validering af en API-nøgle indebærer en opslag i databasen for at se, om nøglen matcher en kendt, gyldig nøgle, der er knyttet til en bruger.

Oprettelse af API-nøgler

For at understøtte API-nøgler skal du:

  1. Definere en model og database-tabel: Opret en simpel Entity Framework-model (f.eks. UserApiKey), der repræsenterer API-nøgler. Denne model skal indeholde selve nøglens værdi og en relation til IdentityUser-tabellen for at knytte nøglen til en specifik bruger. Det er en god praksis at sikre, at nøgleværdien er unik og indekseret i databasen for hurtig opslag.
  2. Oprette en tjenesteklasse til nøglegenerering: En ApiKeyService kan håndtere genereringen af nye API-nøgler. Nøgleværdien kan være en tilfældigt genereret streng, f.eks. ved hjælp af GUID'er, men for produktionsbrug anbefales en kryptografisk sikker streng for at undgå forudsigelighed. Denne tjeneste vil også gemme den genererede nøgle i databasen og knytte den til den relevante bruger.
  3. Exponere et endpoint: Tilføj et nyt action-metode i din UsersController (f.eks. CreateApiKey), der tillader klienter at anmode om en ny API-nøgle ved at sende deres loginoplysninger. Ligesom med JWT-generering vil denne metode validere brugerens loginoplysninger via UserManager og derefter kalde ApiKeyService for at generere og gemme nøglen.

Implementering af en Brugerdefineret Autentifikations-Handler

Fordi ASP.NET Core ikke leveres med en indbygget autentifikations-handler for API-nøgler, skal du implementere din egen. En autentifikations-handler er en klasse, der arver fra AuthenticationHandler<AuthenticationSchemeOptions> og implementerer HandleAuthenticateAsync-metoden. Denne metode er kernen i din API-nøgleautentifikationslogik:

  • Den vil inspicere den indgående HTTP-anmodning, typisk ved at lede efter en specifik header (f.eks. Api-Key).
  • Hvis headeren findes, tager den værdien og udfører et databaseopslag i din UserApiKeys-tabel for at finde en matchende nøgle.
  • Hvis en gyldig nøgle findes, oprettes en AuthenticationTicket, der indeholder brugerens identitet (baseret på claims fra den tilknyttede bruger). Dette signalerer til ASP.NET Core's autentifikations-middleware, at anmodningen er autentificeret.
  • Hvis nøglen ikke findes eller er ugyldig, returneres et fejlresultat, hvilket får ASP.NET Core til at afvise anmodningen med en 401 (Unauthorized) statuskode.

Konfiguration af API Nøgle Autentifikation

For at ASP.NET Core skal kunne bruge din brugerdefinerede API Key-autentifikations-handler, skal du konfigurere den i Startup.cs's ConfigureServices-metode. Dette gøres ved at kalde AddScheme på din AuthenticationBuilder, som du får fra AddAuthentication. Du skal angive navnet på dit autentifikations-skema (f.eks. "ApiKey") og typen af din brugerdefinerede handler (f.eks. ApiKeyAuthenticationHandler).

Does ASP NET Core web API support authentication?
We’ve updated an existing ASP.NET Core Web API application so that it supports authentication using two strategies: JWT and API Keys. We leveraged the Identity libraries to securely store and manage user accounts. We used ASP.NET Core’s built-in authentication capabilities to enable JWT generation and usage.

For eksempel:

services.AddAuthentication(options =>{ options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(options => { /* ... */ }) .AddScheme<AuthenticationSchemeOptions, ApiKeyAuthenticationHandler>( "ApiKey", options => { } ); 

Dette registrerer dit API Key-skema og gør det tilgængeligt for brug i din applikation.

Anvendelse af [Authorize] med Flere Skemaer

En af de stærke sider ved ASP.NET Core's autentifikationssystem er dets fleksibilitet. Du kan tillade flere autentifikationsskemaer på det samme endpoint. Dette er især nyttigt, hvis du vil understøtte både JWT og API-nøgler for adgang til de samme ressourcer. Du kan gøre dette ved at angive en komma-separeret liste af skemanavne i AuthenticationSchemes-parameteren af din [Authorize]-attribut:

[Authorize(AuthenticationSchemes = $"{JwtBearerDefaults.AuthenticationScheme},ApiKey")] public async Task<ActionResult<IEnumerable<BodyType>>> GetBodyTypes() { return await _context.BodyTypes.ToListAsync(); } 

Dette fortæller ASP.NET Core, at endpointet kan tilgås, hvis anmodningen er autentificeret via enten JWT Bearer-skemaet eller dit brugerdefinerede "ApiKey"-skema. Anmodninger vil nu acceptere en Authorization: Bearer <token>-header eller en Api-Key: <nøgle>-header, afhængigt af den valgte autentifikationsmetode.

Vigtige Overvejelser og Bedste Praksis

Implementering af autentifikation er et kritisk skridt mod en sikker API, men der er altid yderligere overvejelser:

  • Sikkerhed for hemmelige nøgler: Din JWT-nøgle og eventuelle andre hemmelige nøgler i appsettings.json bør aldrig tjekkes ind i versionskontrolsystemer som GitHub. Brug altid sikre metoder til håndtering af hemmeligheder i produktion, såsom Azure Key Vault, AWS Secrets Manager eller miljøvariabler.
  • Fejlhåndtering: Sørg for at give klare, men ikke for detaljerede, fejlmeddelelser, når autentifikation mislykkes. Undgå at afsløre information, der kan hjælpe en angriber.
  • Testbarhed: Ved at bruge Dependency Injection og abstrakte tjenester (interfaces) i stedet for konkrete implementeringer, som f.eks. ITokenCreationService i stedet for JwtService, gør du din kode nemmere at teste og vedligeholde.
  • Logning: Implementer passende logning af autentifikationsforsøg (både succesfulde og mislykkede) for at hjælpe med overvågning og sikkerhedsrevisioner.

Med de værktøjer og teknikker, der er beskrevet i denne artikel, er du godt rustet til at implementere robuste autentifikationsløsninger i dine ASP.NET Core Web API'er, uanset om du vælger den moderne og standardiserede JWT-tilgang eller den mere direkte API-nøgle-metode.

Ofte Stillede Spørgsmål (FAQs)

Hvad er forskellen mellem autentifikation og autorisation i ASP.NET Core Web API?

Autentifikation er processen med at bekræfte en brugers identitet (hvem er du?), mens autorisation er processen med at bestemme, hvilke handlinger eller ressourcer en autentificeret bruger har adgang til (hvad må du gøre?). Autentifikation sker typisk først, hvorefter autorisationen bygger videre på den bekræftede identitet.

Hvorfor skal jeg bruge ASP.NET Core Identity til brugerstyring?

ASP.NET Core Identity er en omfattende API, der forenkler og sikrer brugerstyring. Det håndterer komplekse opgaver som adgangskode-hashing, brugeroprettelse, rolleadministration og integration med Entity Framework, hvilket sparer dig for betydelig udviklingstid og reducerer risikoen for sikkerhedsfejl sammenlignet med at implementere det fra bunden.

Hvad er en JWT, og hvorfor er den "kortlivet"?

En JWT (JSON Web Token) er en kompakt, URL-sikker måde at repræsentere claims mellem to parter. Den er 'kortlivet' (typisk udløber den efter få minutter eller timer) for at minimere risikoen, hvis tokenet bliver stjålet eller kompromitteret. Et udløbet token kan ikke længere bruges til at opnå adgang, hvilket forbedrer sikkerheden.

Kan jeg bruge både JWT og API-nøgler samtidigt i min ASP.NET Core Web API?

Ja, absolut. ASP.NET Core's autentifikationsramme er designet til at understøtte flere autentifikationsskemaer samtidigt. Du kan konfigurere både JWT Bearer-skemaet og et brugerdefineret API Key-skema, og derefter bruge [Authorize(AuthenticationSchemes = "JwtBearer,ApiKey")]-attributten til at tillade adgang via begge metoder på de samme endpoints.

Hvad er en "Authentication Handler" i ASP.NET Core?

En Authentication Handler er en klasse, der er ansvarlig for at udføre den faktiske autentifikationslogik for et specifikt autentifikationsskema. Den modtager en indgående anmodning, inspicerer den for loginoplysninger (f.eks. en JWT eller en API-nøgle), validerer disse oplysninger og opretter en autentificeret brugeridentitet (en ClaimsPrincipal), hvis autentifikationen lykkes. Du kan implementere dine egne handlers for at understøtte brugerdefinerede autentifikationsmetoder, som det er tilfældet med API-nøgler.

Hvad er "Claims" i forbindelse med JWT og ASP.NET Core Identity?

Claims (krav) er udsagn om en entitet (typisk en bruger). I forbindelse med JWT er claims data, der er indlejret i tokenet og bruges til at identificere brugeren og give yderligere information om dem (f.eks. brugernavn, e-mail, roller, ID). I ASP.NET Core Identity repræsenteres en autentificeret brugers identitet også via claims, der bruges af autorisationssystemet til at træffe beslutninger om adgangsrettigheder.

Hvis du vil læse andre artikler, der ligner Sikkerhed i ASP.NET Core Web API: Autentifikation med JWT & API-nøgler, kan du besøge kategorien Teknologi.

Go up