JWT Authentication en Authorization in .NET Core 5.0

Wat is JWT?

JWT staat voor de afkorting JSON Web Token. JWT authenticatie is een manier om veilig informatie uit te wisselen via JSON-object. De informatie is digitaal getekend. De digitale handtekening kan bestaan uit een secret (HMAC algoritme) , public of private key (RSA of ECDSA).

JWT bestaat uit:

  1. Header
  2. Payload
  3. Signature

Meer technische informatie kan je hier vinden. Voorbeeld JSON Web Token:

Copy to Clipboard

Implementatie

Hoe implementeren we dit nu in de praktijk?

Wat hebben we nodig ?

  1. Visual Studio 2019 of VsCode (Voor deze tutorial zal ik Visual Studio gebruiken)
  2. .Net Core 3.1 (normaal reeds mee geïnstalleerd bij Visual studio)

Let’s go!

Nieuw project aanmaken.

Visual Studio -> Create New Project -> Asp.Net Core Web application -> Select Web Api Template -> Create.

NuGet Package installeren:

  1. Rechts klikken op het project => Manage NuGet package.
  2. Zoek naar: Microsoft.AspNetCore.Authentication.JwtBearer.
  3. Klik op installeren.

Aanpassen Startup.cs

In de methode ConfigureService() gaan we JWT authenticatie gaan registreren.

Copy to Clipboard

Aanpassen appsettings.json met de nodige JWT parameters

Copy to Clipboard

Beschikbaar maken van de authenticatie service in de applicatie

Om dit mogelijk te maken moeten we de app.UseAuthentication in de Configure() methode aanpassen.

Copy to Clipboard

Update Startup.cs  ConfigureService() methode en voeg de authorization code toe

Copy to Clipboard

Voor de autorisatie gaan we gebruik maken van Policies:

  • Admin
  • User

We gaan een nieuwe folder: “Models” aanmaken. In deze folder maak een nieuwe class Policies.cs.

Copy to Clipboard

Om een policy te kunnen gebruiken hebben we ook een User nodig. Hiervoor gaan we ook in het mapje models een User.cs class aanmaken.

Copy to Clipboard

Generen van een JSON Web Token

We hebben nu alle configuratie achter de rug. Volgende wat we moeten voorzien is een API controller die methoden Login() , AuthenticateUser(), GenerateJWTToken bevatten.

Maak in de folder controllers een nieuwe controller aan : LoginController.cs.

De LoginMethode is voorzien met een attribute [AllowAnonymous] en zal via een API call aangeroepen worden zonder dat er ingelogd moet worden.

Via de methode AuthenticateUser controleren we nu via een static list of de gebruiker bestaat in combinatie met een correct wachtwoord. In de praktijk gaan we hier naar de database om de gebruikers zijn gegevens af te toetsen.

Het effectief genereren van een JWT Token gebeurt in de GenerateJWTToken. Hier gaan we alle parameters omzetten (geldigheidsduur, claim, …) in een geldig JWT token. Zoals we kunnen zien is de token opgebouwd aan de hand van de configuratie die we in de appsettings.json geconfigureerd hebben (_config[“Jwt:SecretKey”])).

Copy to Clipboard

Opvragen van data 

Onze laatste stap is het effectief opvragen van eventuele data die niet voor iedereen toegankelijk is.

Als concreet voorbeeld hebben we hier een Order controller gemaakt.

In ingelogde User zal andere data ontvangen dan een Administrator en kan ook geen methode van elkaar opvragen. Deze instellingen komt door de attributes die we boven de methoden gedeclareerd hebben.

Copy to Clipboard

Testen

Start de API op en je zal meteen UI van swagger voor je zien.

De code is klaar en we kunnen we beginnen met testen a.d.h.v. Swagger of Postman.

Let op! Indien we via Swagger gaan testen moeten we volgende configuratie in de startup.cs (ConfigureServices method) gaan updaten om makkelijk een JWT te kunnen toevoegen na het inloggen.

Copy to Clipboard
Copy to Clipboard