How do you implement authentication and authorization in ASP.NET Core?

4 minintermediateASP.NET-Coreauthenticationauthorizationsecurity

Quick Answer

Authentication is configured via `AddAuthentication` with a scheme/handler (cookies, JWT bearer, OpenID Connect) and the `UseAuthentication` middleware; authorization is configured via `AddAuthorization` (policies/roles) and `UseAuthorization`, enforced with `[Authorize]`. Order matters: `UseAuthentication` must come before `UseAuthorization`. Policies and requirements support fine-grained, claims-based rules.

Detailed Answer

Authentication and authorization in ASP.NET Core are implemented through middleware and services:

Step 1: Install Required Packages

dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
dotnet add package Microsoft.AspNetCore.Identity.EntityFrameworkCore

Step 2: Configure Services in Program.cs

builder.Services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(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"]))
    };
});

builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("AdminOnly", policy => policy.RequireRole("Admin"));
    options.AddPolicy("MinimumAge", policy => policy.Requirements.Add(new MinimumAgeRequirement(18)));
});

Step 3: Add Middleware

app.UseAuthentication();
app.UseAuthorization();

Step 4: Protect Endpoints

[Authorize]
[ApiController]
[Route("api/[controller]")]
public class SecureController : ControllerBase
{
    [Authorize(Roles = "Admin")]
    public IActionResult AdminOnly() => Ok("Admin access");
    
    [Authorize(Policy = "MinimumAge")]
    public IActionResult AgeRestricted() => Ok("Age verified");
}