How to Use JWSHMAC in ASP.NET Web Application

JWSHMAC Overview

WSHMAC stands for JSON Web Signature with HMAC. It's a method of securing JSON data using the HMAC (Hash-based Message Authentication Code) algorithm. This is a part of the broader JSON Web Token (JWT) standard, which is used for creating access tokens that assert some number of claims. These tokens can be used to securely transmit information between parties.

Why Use JWSHMAC?

  1. Integrity and Authenticity: It ensures that the data has not been tampered with and is from a trusted source.
  2. Stateless Authentication: Useful for stateless authentication in web applications, where the server can validate the token without storing any session data.
  3. Cross-Domain Security: Allows secure data transmission across different domains.

How to use JWSHMAC in ASP.NET Web Application?
 

Prerequisites

  1. ASP.NET Web Application
  2. System.IdentityModel.Tokens.Jwt package

Steps to Implement JWSHMAC
 

1. Install the JWT NuGet Package

Install-Package System.IdentityModel.Tokens.Jwt

2. Create a JWT Helper Class

Create a helper class to handle JWT creation and validation.

using System;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using Microsoft.IdentityModel.Tokens;
using System.Text;
public class JwtHelper
{
    private const string SecretKey = "your-256-bit-secret";
    private readonly SymmetricSecurityKey _signingKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(SecretKey));
    public string GenerateToken(string username, int expireMinutes = 60)
    {
        var tokenHandler = new JwtSecurityTokenHandler();
        var claims = new[]
        {
            new Claim(ClaimTypes.Name, username)
        };
        var credentials = new SigningCredentials(_signingKey, SecurityAlgorithms.HmacSha256);
        var tokenDescriptor = new SecurityTokenDescriptor
        {
            Subject = new ClaimsIdentity(claims),
            Expires = DateTime.Now.AddMinutes(expireMinutes),
            SigningCredentials = credentials
        };
        var token = tokenHandler.CreateToken(tokenDescriptor);
        return tokenHandler.WriteToken(token);
    }
    public ClaimsPrincipal ValidateToken(string token)
    {
        var tokenHandler = new JwtSecurityTokenHandler();
        var validationParameters = new TokenValidationParameters
        {
            ValidateIssuer = false,
            ValidateAudience = false,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            IssuerSigningKey = _signingKey
        };
        try
        {
            var principal = tokenHandler.ValidateToken(token, validationParameters, out _);
            return principal;
        }
        catch
        {
            return null;
        }
    }
}

3. Generate a Token in your Controller

Use the helper class to generate a token when the user logs in.

public class AuthController : Controller
{
    private readonly JwtHelper _jwtHelper;
    public AuthController()
    {
        _jwtHelper = new JwtHelper();
    }
    [HttpPost]
    public IActionResult Login(string username, string password)
    {
        // Validate the user credentials (this is just an example, in reality, you'd check the database)
        if (username == "test" && password == "password")
        {
            var token = _jwtHelper.GenerateToken(username);
            return Ok(new { Token = token });
        }
        return Unauthorized();
    }
}

4. Apply token validation for secure endpoints

[Authorize]
[ApiController]
[Route("[controller]")]
public class SecureController : ControllerBase
{
    [HttpGet]
    public IActionResult GetData()
    {
        var username = User.Identity.Name;
        return Ok(new { Message = "This is a secure data", User = username });
    }
}

5. Configure Authentication Middleware

In the Startup.cs file, configure the authentication middleware.

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();
        var key = Encoding.ASCII.GetBytes("your-256-bit-secret");        
        services.AddAuthentication(x =>
        {
            x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        })
        .AddJwtBearer(x =>
        {
            x.RequireHttpsMetadata = false;
            x.SaveToken = true;
            x.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuerSigningKey = true,
                IssuerSigningKey = new SymmetricSecurityKey(key),
                ValidateIssuer = false,
                ValidateAudience = false
            };
        });
    }
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        app.UseRouting();
        app.UseAuthentication();
        app.UseAuthorization();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
}

Using JWSHMAC in an ASP.NET web application provides a robust way to ensure secure communication and stateless authentication. By following the steps above, you can generate, validate, and use JWTs in your ASP.NET web application effectively.


Similar Articles