ASP.NET Core 3.1 - IdentityServer4 - App Settings On Azure (Parte 13)

Na Parte 12 eu mostrei as premissas do Azure e como configurar o certificado digital. Agora vamos ver como nossa aplicação do IdentityServer4 vai usar essas configurações.

Program.cs

A primeira alteração foi feita para que houvesse suporte ao appsettings.json conforme o ambiente selecionado através das options do método ConfigureAppConfiguration conforme exibido a seguir.

Isso significa que para cada ambiente (Development, Staging e Production) podemos ter configurações diferentes.
Por padrão ao criar um projeto ASP.NET Core, a variável de ambiente é sempre Development, você pode conferir este detalhe nas propriedades do projeto conforme imagem a seguir.

Project Properties Environment Variables

No Azure

No Azure, por definição tudo é Production e para que você tenha a liberdade de trabalhar com outros ambientes, você pode utilizar os Deployment Slots. Um detalhe, para que o App Service libere o funcionamento por slots você deve estar vinculado a um service plan standard or premium, significa que não é o free, nem o shared tão pouco o basic, são planos mais avançados. O que o slot faz é configurar a variável de ambiente "ASPNETCORE_ENVIRONMENT" com a opção desejada, com isso automaticamente o arquivo appsettings..json é de onde as configurações serão carregadas.

Nosso arquivo que possui as configurações de produção para esta série, até este momento está configurado conforme a seguir.

Para ler as configurações, criei a classe AppSettings conforme a seguir.

No método ConfigureServices no Startup.cs incluí a linha:

services.Configure(_configuration.GetSection(nameof(AppSettings)));

O método Configure acima, realiza dois trabalhos:

services.AddOptions()

services.AddSingleton da classe AppSettings

Com isso, podemos pegar os dados do appsettings.<>.json através de injeção de dependência ou usando Service Locator. Vou falar sobre o Service Locator mais abaixo.

Boas práticas

Juntamente com o código eu aproveitei e fiz algumas mudanças para começar um processo de limpeza do código utilizando métodos de extensão.

Extension Methods

Esta funcionalidade foi disponibilizada no C# 3.0 permitindo estender funcionalidades de uma classe especifica do framework. Os métodos de extensão permitem que sejam adicionados outros métodos à tipos existentes sem que haja necessidade de implementar heranças, classes parciais ou até mesmo compilar o código para que estejam disponíveis.

Premissas

  1. A classe precisa ser estática;
  2. O método precisa ser estático;
  3. Para que o método seja exibido, o primeiro parâmetro deve ser precedido do this, depois a classe ou interface e o nome do parâmetro.

Método de Extensão para Certificado Digital

Criei a classe IdentityServerSigningCredentialExtension onde o método AddCustomSigningCredential utiliza os dados do appsettings.<>.json para mudar o comportamento quando o IdentityServer4 estiver publicado no Azure ou não.

Service Locator

Como a classe onde está o método de extensão é estática, não possui suporte a um construtor, sendo assim não há como através de injeção de dependência pegar os dados do arquivo de configurações, sendo assim, vamos usar o Service Locator para isso.
No método AddCustomSigningCredential temos a linha a seguir e é através dela que conseguimos obter o objeto instanciado populado com os valores.

var appSettings = services.BuildServiceProvider().GetService>().CurrentValue;

Refactoring

Além do método de extensão responsável pela coleta das informações do arquivo de configurações, criei outros métodos para que o código fique mais clean e aos olhos das boas práticas também mais elegante.

Você pode conferir tudo isso no Github.

Continua em ASP.NET Core - Console - App Service Editor On Azure (Parte 14).