ASP.NET Core 3.1 — IdentityServer4 — In-memory (Parte 1)

Você já deve ter ouvido falar sobre o IdentityServer4, talvez usado o SaaS da Auth0, visto a palestra no .NET Conf 2019 que ocorreu em Setembro/2019 ou até mesmo a palestra Identity 101 how username password got so complicated em Outubro/2019 aqui em Florianópolis/SC sobre o assunto. Este assunto é muito vasto, de complexidade média e possui diversos caminhos que podem ser seguidos, diante disso preparamos uma série detalhada que apoia na solução de problemas do dia a dia das empresas no que diz respeito à autenticação de usuários, autorização de API’s e outros assuntos relacionados.

Para começar, vamos ver as configurações básicas do IdentityServer4 funcionando sem banco de dados, com uma classe ou arquivo de configuração e entender as melhores formas de usá-lo, sem deixar de lado o uso do ASP.NET Core 3.1.

Atualização

SDK

Já nas novidades do .NET Core 3.0 foram anunciadas algumas alterações referente as versões. Sempre que for atualizado, por exemplo da versão x.x.101 para a x.x.102 a 101 será removida, mas mantida caso surja uma versão x.x.200.

Estrutura de pastas

Criação do projeto

Na imagem anterior, caso você tenha o Docker instalado, mantenha a opção Enable Docker Support habilitada e no combo deixe na opção Linux, ambas as configurações estão do lado direito na seção Advanced.

Nesta imagem deixe as configurações do Visual Studio como exemplificado, isso vai fazer com que os containers e as imagens não sejam criados na abertura do projeto. Mesmo que sejam ações executadas em background, neste momento apenas vão ocupar espaço.

NuGet Package

Statup.cs

As principais configurações são do IdentityServer para o Startup.cs são:

using IdentityServer4.Configuration;
using IdentityServer4.Models;
var identityServer = services.AddIdentityServer(options =>
{
options.Events.RaiseErrorEvents = true;
options.Events.RaiseInformationEvents = true;
options.Events.RaiseFailureEvents = true;
options.Events.RaiseSuccessEvents = true;
});
identityServer.AddInMemoryIdentityResources(_configuration.GetSection(nameof(IdentityResources)));
identityServer.AddInMemoryApiResources(_configuration.GetSection(nameof(ApiResource)));
identityServer.AddInMemoryClients(_configuration.GetSection(nameof(Client)));
if (_webHostEnvironment.IsDevelopment())
identityServer.AddDeveloperSigningCredential();
services.AddAuthentication();app.UseIdentityServer();
app.UseAuthorization();

Depois disso, vamos ao que interessa, entender como tudo isso funciona.

In-memory

Uma grande vantagem do IdentityServer é que, mesmo em memória, caso a aplicação seja reiniciada no IIS, ou um container, o token gerado não será invalidado nem perdido, isso se deve ao fato dele expirar em um período específico (padrão) de 3600 segundos e o payload ser gerado através de criptografia RSA de 2048 bits que não muda quando o serviço é reiniciado, veremos mais sobre essa questão na criptografia nos próximo tópico.

SigningCredential

Para publicação em ambiente de produção (diferente de Development) obrigatoriamente você vai precisar de um certificado digital (*.pfx) e esse detalhe as vezes é o que atrapalha bastante, então vamos ver na parte 2 como utilizar o OpenSSL para gerar um certificado digital do tipo A1 (*.pfx) que funcionará em ambiente de produção, como configurar e se sua aplicação for hospedada no Azure também vai dar certo.

Resources (recursos)

IdentityResources

ApiResources

Para esta configuração já temos uma ApiResources chamado “payment” que vai ser utilizado para configurar uma API que terá a função de realizar o pagamento online, temos isso nas próximas partes do projeto.

Clients

appsettings.json

Funcionamento

A imagem anterior mostra que o IdentityServer está configurado e funcionando.

A imagem anterior mostra como buscar um token. Este exemplo já simula a busca do token que permite acessar a API payment que iremos criar mais adiante.

Em caso de dúvida você pode baixar o projeto que está do GitHub.

PS: Este projeto está em constante evolução, então pode haver diferenças entre o código do gist e o código real.

Continua em ASP.NET Core 3.1 — IdentityServer4 — Segurança (Parte 2)