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");
}