Аутентификация и авторизация API в ASP.NET Core C#

При разработке API на ASP.NET Core важно обеспечить безопасный доступ к ресурсам. Для этого используются механизмы аутентификации и авторизации.

Аутентификация в ASP.NET Core

Аутентификация (Authentication) — это процесс проверки подлинности пользователя. В ASP.NET Core поддерживается несколько схем аутентификации, таких как:

  • JWT (JSON Web Token)
  • OAuth 2.0
  • OpenID Connect
  • Cookie-based

Настройка аутентификации с JWT

JWT — один из самых распространенных способов аутентификации API. Для настройки JWT-аутентификации необходимо добавить в проект пакет Microsoft.AspNetCore.Authentication.JwtBearer и сконфигурировать сервисы аутентификации в Program.cs:

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
using System.Text;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddAuthentication(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();
builder.Services.AddControllers();

var app = builder.Build();

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

app.Run();

Авторизация в ASP.NET Core

Авторизация (Authorization) определяет права пользователя на доступ к определенным ресурсам. В ASP.NET Core авторизация может быть:

  • На основе ролей (Role-based Authorization)
  • На основе политик (Policy-based Authorization)
  • На основе требований (Claims-based Authorization)

Авторизация на основе ролей

Ролевая авторизация позволяет ограничивать доступ к контроллерам или методам на основе ролей пользователя:

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

[Authorize(Roles = "Admin")]
[ApiController]
[Route("api/admin")]
public class AdminController : ControllerBase
{
    [HttpGet]
    public IActionResult Get()
    {
        return Ok("Доступ разрешен только администраторам");
    }
}

Авторизация на основе политик

Авторизация на основе политик авторизация позволяет задавать более гибкие правила доступа, основанные на кастомных политиках:

builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("OnlyForEditors", policy => policy.RequireClaim("Editor"));
});

Затем эту политику можно применить к контроллеру или методу:

[Authorize(Policy = "OnlyForEditors")]
[ApiController]
[Route("api/editor")]
public class EditorController : ControllerBase
{
    [HttpGet]
    public IActionResult Get()
    {
        return Ok("Доступ разрешен только редакторам");
    }
}

Защита эндпоинтов API

Для защиты API необходимо явно указывать [Authorize] над контроллерами или методами. Если доступ должен быть открыт для всех, можно использовать [AllowAnonymous]:

[AllowAnonymous]
[HttpGet("public")]
public IActionResult PublicEndpoint()
{
    return Ok("Этот эндпоинт доступен без аутентификации");
}

Аутентификация и авторизация являются важными аспектами защиты API в ASP.NET Core. Использование JWT позволяет безопасно проверять подлинность пользователей, а ролевые и политические механизмы авторизации помогают управлять доступом к ресурсам.