IConfiguration vs IOptions NET
Synchronous and Asynchronous in .NET Core
Model Binding and Validation in ASP.NET Core
ControllerBase vs Controller in ASP.NET Core
ConfigureServices and Configure methods
IHostedService interface in .NET Core
ASP.NET Core request processing
| Dependency Injection in NET core | Securing an ASP.NET Core Web API | |
All about JWT, its Structure and Signature and Validation |
A JWT (JSON Web Token) is a compact, URL-safe token used to securely transmit information between parties as a JSON object. It is commonly used for authentication and authorization in web applications.
A JWT consists of three parts separated by dots:
header.payload.signature
Contains metadata about the token, such as the signing algorithm.
{
"alg": "HS256",
"typ": "JWT"
}
Contains the claims or user data.
{
"sub": "1234567890",
"name": "John Doe",
"admin": true,
"exp": 1700000000
}
Used to verify that the token was not tampered with.
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secretKey )
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. eyJzdWIiOiJ1c2VyMTIzIiwibmFtZSI6IkpvaG4gRG9lIiwicm9sZSI6IkFkbWluIiwiZXhwIjoxNzAwMDAwMDAwfQ. SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Run the following command to install the JWT library:
dotnet add package System.IdentityModel.Tokens.Jwt
"Jwt": {
"Key": "YourSuperSecretKeyHere",
"Issuer": "YourAppName",
"Audience": "YourAppUsers",
"ExpireMinutes": 60
}
using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;
using Microsoft.IdentityModel.Tokens;
public class JwtTokenGenerator
{
private readonly IConfiguration _config;
public JwtTokenGenerator(IConfiguration config)
{
_config = config;
}
public string GenerateToken(string username)
{
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Sub, username),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
};
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"]));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
issuer: _config["Jwt:Issuer"],
audience: _config["Jwt:Audience"],
claims: claims,
expires: DateTime.Now.AddMinutes(Convert.ToDouble(_config["Jwt:ExpireMinutes"])),
signingCredentials: creds
);
return new JwtSecurityTokenHandler().WriteToken(token);
}
}
[HttpPost("login")]
public IActionResult Login([FromBody] LoginModel model)
{
if (model.Username == "admin" && model.Password == "password")
{
var token = _jwtTokenGenerator.GenerateToken(model.Username);
return Ok(new { token });
}
return Unauthorized();
}
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
"Jwt": {
"Key": "YourSuperSecretKeyHere",
"Issuer": "YourAppName",
"Audience": "YourAppUsers",
"ExpireMinutes": 60
}
builder.Services.AddAuthentication("Bearer")
.AddJwtBearer("Bearer", options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = builder.Configuration["Jwt:Issuer"],
ValidAudience = builder.Configuration["Jwt:Audience"],
IssuerSigningKey = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]))
};
});
public string GenerateToken(string username)
{
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Sub, username),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString())
};
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_config["Jwt:Key"]));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
issuer: _config["Jwt:Issuer"],
audience: _config["Jwt:Audience"],
claims: claims,
expires: DateTime.Now.AddMinutes(Convert.ToDouble(_config["Jwt:ExpireMinutes"])),
signingCredentials: creds
);
return new JwtSecurityTokenHandler().WriteToken(token);
}
[HttpPost("login")]
public IActionResult Login([FromBody] LoginModel model)
{
if (model.Username == "admin" && model.Password == "password")
{
var token = _jwtTokenGenerator.GenerateToken(model.Username);
return Ok(new { token });
}
return Unauthorized();
}
[Authorize]
[HttpGet("secure-data")]
public IActionResult GetSecureData()
{
return Ok("This is protected data.");
}
| Dependency Injection in NET core | Securing an ASP.NET Core Web API | |