ASP .NET Core -  Usando o IdentityServer4 - II


Neste artigo veremos como usar o IdentityServer4 com a ASP .NET Core.

Continuando o artigo anterior vamos agora a partir da documentação do OpenID Connect Discovery  ver como como obter informações da configuração do nosso IdentityServer.

A seguir vamos gerar o token de acesso e criar nosso projeto WebAPI.

OpenID Discovery Document - Informações e token de acesso

O OpenID Discovery Document esta disponível para todos os provedores OpenId no endpoint :   /.well-known/openid-configuration

Este documento contém a definição de seu IdentityServer como: o endpoint do token (o endpoint para o qual você faz o POST, para recuperar tokens de acesso), escopos suportados, a URL do IdentityServer em execução e assim por diante.

Assim vamos ter que acessar o endpoint /.well-known/openid-configuration a partir da nossa aplicação ASP.NET Core em execução.

Neste artigo eu estou usando o Google Chrome e para obter uma visualização do JSON mais amigável estou usando o plugin JSON Formater do Chrome.

Assim executando nosso projeto novamente e acionando o endpoint /.well-known/openid-configuration teremos o resultado abaixo:

Obs: Aqui estou executando a partir do IIS e no meu ambiente a porta usada é : localhost:44306

Observe as informações para o emissor, o token endpoint e os escopos suportados que definimos.

Obtendo o token de acesso via POSTMAN

A partir do OpenID Discovery Document podemos obter informações sobre endpoint configurado para recuperar o token de acesso.

Vamos abrir o POSTMAN e enviar uma solicitação POST para o terminal do token de acesso.

Se você não nunca usou o POSTMAN a instalação pode ser feita neste link:  https://www.getpostman.com/apps ou se preferir abra o Google Chrome e digite postam e a seguir clique no link:  Postman - Chrome Web Store

Na janela que será aberta clique no botão - Usar no Chrome:

A seguir registre uma conta e faça o login e pronto.

Com o POSTMAN aberto define uma requisição POST para o endereço e porta da sua aplicação definindo o endpoint connect/token e definindo no Body a configuração x-www-form-urlencoded e a seguir as chaves e os valores mostrados abaixo:

Ao clicar em Send teremos no Response o valor do access token conforme mostrado a seguir:

Abaixo temos a mesma visualização do response em um formato mais amigável:

Com o usuário autorizado com sucesso o IdentityServer4 retorna um token de acesso que é valido por 3600 segundos ou uma hora. Note que o token é do tipo 'Bearer".

Entendendo o Token JWT

Um token JWT consiste em três partes:

  1. Header ou Cabeçalho -  É composto por duas partes:  o tipo do token, que é JWT, e o algoritmo de assinatura que está sendo usado, como HMAC SHA256 ou RSA.
    Exemplo:   {   "alg": "HS256" ,  "typ" : "JWT" }
  1. PayLoad ou Carga útil  - É o corpo do JWT e contém as claims.  Claims são declarações sobre uma entidade (normalmente, o usuário) e dados adicionais. Existem três tipos de claims: claims registradas, públicas e privadas.
    Exemplo :   { "sub": "1234567890", "name": "Macoratti", "admin": true }

Obs: O JWT possui palavras reservadas e recomendadas para serem colocadas dentro do payload. São elas:

  1. Signature ou Assinatura - Para criar a parte da assinatura, você precisa pegar o cabeçalho codificado, a carga codificada, um segredo, o algoritmo especificado no cabeçalho e sinalizar isso.
    Exemplo :  HMACSHA256( base64UrlEncode(header) + "."
                   + base64UrlEncode(payload), secret)

Juntando as 3 partes, a saída gera três strings Base64-URL separadas por pontos que podem ser facilmente transmitidos em ambientes HTML e HTTP, sendo mais compactos quando comparados a padrões baseados em XML, como o SAML.  

Exemplo :  eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdW
IiOiIxMjM0NTY3ODkwIiwibm
FtZSI6IkpvaG4gRG9l
IiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwp
MeJf36POk6yJV_adQssw5c

Para entender e obter informações e verificar o token de acesso JWT gerado  podemos acessar o site : JWT.io

Acessando o site jwt.io e colando o token de acesso na caixa Encoded teremos a decodificação do token conforme mostrado abaixo:

Como podemos ver todos os dados que definimos estão disponíveis em nosso token de acesso e são exibidos no Header e no PayLoad

Assim vamos usar esse token para acessar a API protegida pelo Identity Server.

Criando a aplicação Web API e configurando a solução

Vamos iniciar agora a proteção de uma Web API ASP .NET Core usando o IdentityServer4 onde veremos como acessar o endpoint protegido usando o token de acesso.

Vamos então incluir na solução um no projeto via menu via menu File-> New Project;

Escolhendo o template ASP .NET Core Web Application  e informando o nome WebAPI;

E usando o template ASP.NET Core Web API no ambiente do .NET 5.0 :

Obs: É importante deixar desmarcada a opção Enable OpenAPi support que implementa e ativa o Swagger. Neste exemplo não vamos usar os recursos do Swagger.

Ao final teremos dois projetos na solução :

  1. O projeto do IdentityServer chamado IdentityServer
  2. O projeto Web API chamado WebApi

Como temos dois projetos na solução vamos configurar para que na execução da solução o projeto do IdentityServer seja executado primeiro.

Para isso clique com o botão direito sobre a solução e na janela de propriedades marque a opção : Multiple startup projects e a seguir defina a ordem de inicialização conforme mostrada na figura a seguir:

Após isso podemos executar o projeto e iremos obter no navegador o seguinte resultado:

Pronto, temos agora o projeto IdentityServer e o projeto WebAPI funcionando corretamente e  na próxima parte do artigo vamos implementar a segurança com o IdentityServer4.

Pegue o projeto aqui:  AspnIdentityServer4_WebAPI.zip

"O entendimento para aqueles que o possuem, é uma fonte de vida, mas a instrução dos tolos é a sua estultícia."
Provérbios 16:22

Referências:


José Carlos Macoratti