APIs mínimas no ASP.NET Core nos permitem construir APIs leves com dependências mínimas. Entretanto, muitas vezes ainda precisaremos de autenticação e autorização em nossas APIs mínimas. Há várias maneiras de conseguir isso no ASP.NET Core, incluindo autenticação básica, autenticação baseada em token e autenticação baseada em identidade.

Discutimos a implementação da autenticação básica em APIs mínimas aqui e a autenticação baseada em token JWT em APIs mínimas aqui. Neste artigo, examinaremos como podemos implementar a autenticação baseada em identidade para APIs mínimas no ASP.NET Core.

Para usar os exemplos de código fornecidos neste artigo, você deve ter o Visual Studio 2022 instalado em seu sistema. Se ainda não tiver uma cópia, você pode baixar o Visual Studio 2022 aqui.

Crie um projeto de API Web ASP.NET Core no Visual Studio 2022

Para criar um projeto de API Web ASP.NET Core no Visual Studio 2022, siga as etapas descritas abaixo.

  1. Inicie o IDE do Visual Studio 2022.
  2. Clique em “Criar novo projeto”.
  3. Na janela “Criar novo projeto”, selecione “API Web ASP.NET Core” na lista de modelos exibida.
  4. Clique em Avançar.
  5. Na janela “Configure seu novo projeto”, especifique o nome e o local do novo projeto. Opcionalmente, marque a caixa de seleção “Colocar solução e projeto no mesmo diretório”, dependendo de suas preferências.
  6. Clique em Avançar.
  7. Na janela “Informações adicionais” mostrada a seguir, selecione “.NET 8.0 (Long Term Support)” como a versão da estrutura e desmarque a caixa de seleção que diz “Usar controladores”, pois usaremos APIs mínimas neste projeto.
  8. Em outra parte da janela “Informações adicionais”, deixe o “Tipo de autenticação” definido como “Nenhum” (o padrão) e certifique-se de que as caixas de seleção “Ativar suporte à API aberta”, “Configurar para HTTPS” e “Ativar Docker” permaneçam desmarcadas . Não usaremos nenhum desses recursos aqui.
  9. Clique em Criar.

Usaremos este projeto de API Web do ASP.NET Core para trabalhar com os exemplos de código fornecidos nas seções abaixo.

Gerenciamento de identidade no ASP.NET Core

O ASP.NET Core inclui um recurso poderoso conhecido como gerenciamento de identidade que foi aprimorado no .NET 8. A estrutura de identidade integrada no ASP.NET Core fornece o middleware necessário para implementar autenticação, gerenciamento de usuários e autorização baseada em função, dessa forma tornando mais simples a implementação de mecanismos de autenticação robustos e seguros em sua aplicação.

A estrutura de identidade do ASP.NET Core é extensível e personalizável com suporte para os seguintes recursos principais:

  • Autenticação e autorização
  • Gerenciamento de usuários
  • Gerenciamento de funções
  • Hash de senha
  • Autenticação baseada em token
  • Autenticação baseada em declarações

Crie uma API mínima no ASP.NET Core

No projeto de API Web que criamos acima, substitua o código gerado pelo código a seguir para criar uma API mínima básica.

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/helloworld", () => "Hello, World!");
app.Run();

Ao executar a aplicação, o texto “Hello World!” será exibido em seu navegador. Usaremos esse endpoint posteriormente neste artigo.

Instalar pacotes NuGet

Para adicionar suporte para a estrutura de identidade integrada no ASP.NET Core, selecione o projeto na janela do Solution Explorer, clique com o botão direito e selecione “Gerenciar pacotes NuGet”. Na janela NuGet Package Manager, procure os pacotes Microsoft.AspNetCore.Identity.EntityFrameworkCore, Microsoft.EntityFrameworkCore.SqlServer e Microsoft.EntityFrameworkCore.Design e instale-os.

Como alternativa, você pode instalar os pacotes por meio do console do NuGet Package Manager digitando os comandos listados abaixo.

PM> Install-Package Microsoft.AspNetCore.Identity.EntityFrameworkCore
PM> Install-Package Microsoft.EntityFrameworkCore.SqlServer
PM> Install-Package Microsoft.EntityFrameworkCore.Design

Crie um novo DbContext no EF Core

Usaremos o Entity Framework Core neste exemplo. O DbContext é um componente integral do EF Core que representa uma sessão de conexão com o banco de dados. Em seguida, crie uma classe DbContext personalizada estendendo a classe IdentityDbContext conforme mostrado no trecho de código fornecido a seguir.

public class CustomDbContext(DbContextOptions<CustomDbContext> options)
    : IdentityDbContext<IdentityUser>(options){ } 

Você deve registrar a classe DbContext personalizada incluindo a seguinte linha de código no arquivo Program.cs.

builder.Services.AddDbContext<CustomDbContext>();

Habilitar autenticação e autorização no ASP.NET Core

Autenticação é o processo de determinar quem é o usuário e validar sua identidade. Você pode habilitar a autenticação em uma API mínima no ASP.NET Core usando o método AddAuthentication() conforme mostrado no trecho de código fornecido abaixo.

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddAuthentication();

Usamos autorização para restringir o acesso a determinados recursos em um aplicativo. Você pode habilitar a autorização em sua API mínima usando o código a seguir.

builder.Services.AddAuthorization();

O método AddAuthorization é usado para registrar serviços de autorização no contêiner de serviços para que você possa definir regras para ativar ou desativar o acesso aos recursos do aplicativo, se necessário.

Configurar serviços e endpoints de API no ASP.NET Core

A próxima coisa que precisamos fazer é configurar os serviços de identidade e EF Core e os endpoints da API. Para fazer isso, inclua a listagem de código fornecida abaixo no arquivo Program.cs.

using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
builder.Services.AddDbContext<CustomDbContext>();
builder.Services.AddAuthorization();
builder.Services.AddIdentityApiEndpoints<IdentityUser>()
    .AddEntityFrameworkStores<CustomDbContext>();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
app.MapIdentityApi<IdentityUser>();

O método AddIdentityApiEndpoints() no trecho de código anterior adiciona os controladores e serviços necessários para autenticação e autorização (login, logout, registro, etc.). Observe que este é um novo método (introduzido no .NET 8) usado para configurar a integração de identidade em um aplicativo. O método AddIdentityApiEndpoints() aceita uma instância do tipo IdentityUser como parâmetro, que é usado para especificar o tipo de usuário.

Você pode usar o trecho de código a seguir para adicionar autorização ao endpoint /helloworld.

app.MapGet("/helloworld", () => "Hello World!")
.RequireAuthorization();

Fonte completa do arquivo Program.cs

O código-fonte completo do arquivo Program.cs é fornecido abaixo para sua referência.

using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddDbContext<CustomDbContext>();
builder.Services.AddAuthorization();
builder.Services.AddIdentityApiEndpoints<IdentityUser>()
    .AddEntityFrameworkStores<CustomDbContext>();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
app.MapIdentityApi<IdentityUser>();
// Configure the HTTP request pipeline.
app.MapGet("/helloworld", () => "Hello World!")
.RequireAuthorization();
app.UseSwagger();
app.UseSwaggerUI(c =>
{
    c.SwaggerEndpoint("/swagger/v1/swagger.json", "v1");
});
app.Run();
public class CustomDbContext(DbContextOptions<CustomDbContext> options)
    : IdentityDbContext<IdentityUser>(options)
{
    protected override void OnConfiguring(DbContextOptionsBuilder options) =>
    options.UseSqlite("DataSource = DemoDb; Cache=Shared");
}

O recurso de gerenciamento de identidade integrado no ASP.NET Core é poderoso e fácil de usar. As melhorias no .NET 8 tornaram o Identity ainda mais robusto e flexível com uma API de identidade aprimorada, que permite implementar autenticação e autorização baseadas em identidade de maneira mais fácil e eficiente com menos código.