Basic .NET Core API Authentication



This is a tutorial to setup JWT authentication for netcore API.

In Startup.cs file, to enable JWT authentication from any identity provider, you add the following code.


private readonly AuthenticationServerConfiguration _authenticationServerConfiguration;

public Startup(IConfiguration configuration, IWebHostEnvironment environment)
{
    _authenticationServerConfiguration = new AuthenticationServerConfiguration();
    _configuration.GetSection("AuthenticationServer").Bind(_authenticationServerConfiguration);
}
public void ConfigureService (IServiceCollection services)
{
    services.AddAuthorization();
    services
        .AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        })
        .AddJwtBearer(options =>
        {
            //destination of authen server
            options.Authority = _authenticationServerConfiguration.Issuer;
            //destination of web api
            options.Audience = _authenticationServerConfiguration.Audience;
            options.RequireHttpsMetadata = true;
            options.TokenValidationParameters = GetTokenValidationParameters();
        });

    services.AddControllers();
    }
}

public void Configure(IApplicationBuilder app)
{
    app.UseHttpsRedirection();
    app.UseAuthentication();
    app.UseRouting();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}
private TokenValidationParameters GetTokenValidationParameters()
{
    return new TokenValidationParameters
    {
        ValidateIssuer = true,
        ValidIssuer = _authenticationServerConfiguration.Issuer,
        ValidateAudience = true,
        ValidAudience = _authenticationServerConfiguration.Audience,
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = GetSecurityKey(),
        RequireExpirationTime = true,
        ValidateLifetime = true
    };
}


private SecurityKey GetSecurityKey()
{
    X509Certificate2 certificate = GetCertificate();
    return new X509SecurityKey(certificate);
}

private X509Certificate2 GetCertificate()
{
    string fileName = _authenticationServerConfiguration.CertificatePath;
    string password = _authenticationServerConfiguration.CertificatePassword;
    var certificate = new X509Certificate2(fileName, password, X509KeyStorageFlags.MachineKeySet);
    return certificate;
}

Here is AuthenticationServerConfiguration.cs

public class AuthenticationServerConfiguration
{
    public string Audience { get; set; }
    public string CertificatePassword { get; set; }
    public string CertificatePath { get; set; }
    public string Issuer { get; set; }
    public string SecretKey { get; set; }
}

In appsettings.json, add the following

"AuthenticationServer": {
    "Audience": "netcore-api",
    "CertificatePassword": "certificate-password",
    "CertificatePath": "certificate-file-path",
    "Issuer": "https://issuer-url/", //issuer URL (Eg: https://localhost:6003/)
    "SecretKey": "your-secret-key"
}

In ApiController or ControllerBase, you need to enable Authorize() attribute on the controller

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
[Authorize(Roles = "user-role")]
public class AuthorizedBaseController : ControllerBase
{
}

That’s it. This is the basic of using JWT authentication in .Net Core API.