Skip to main content

Olá! Neste artigo iremos implementar e explorar o código para tratar com a autenticação do tipo “API Key” (API Key Authentication). Isso tudo com apenas três linhas de código.

Aqui, queremos a famosa solução simples e estúpida (simple and stupid) e não uma implementação distorcida utilizando MVC [Attributes] ou um middleware customizado para lidar com a autenticação.

Observação: Esse artigo aplica-se às versões do .NET 5, .NET Core 3.1 e .NET Core 2.1.

API Key Authentication
Solução Proposta neste artigo

Ok, ok, ok. Eu sei que é difícil encontrar uma boa implementação de API Key Authentication  na internet. Acredito também ser difícil nos encontrarmos em uma situação que precisemos utilizar de API Key Authentication.

Mas agora você encontrou! Espero que você goste e deixe seu comentário ao fim desse artigo 🙂

Introdução

O ASP.NET já possui toda a infraestrutura de código de Autenticação/Autorização e nos permite estender sua implementação afim de customizarmos com uma implementação própria. Nós podemos estender a implementação nativa para criar nossa lógica de validação (usuário + senha) para consultar um banco de dados ou de qualquer lugar.

Utilizando-se do método AddScheme iremos implementar e criar uma lógica para validação da APIKey ao serviço de autenticação.

Tudo começa com o método services.AddAuthentication(), que possui um construtor que nos permite acessar o método AddScheme. É aqui que nosso manipulador Authentication ApiKey será configurado.

Vamos ao código

Vamos começar criando o arquivo ApiKeyAuthNOptions.cs. Ele será responsável pelas configurações do serviço ApiKeyAuthN.cs (a ser criado posteriormente).

Definimos as propriedades QueryStringKey e ApiKey.

API Key Authentication — ApiKeyAuthNOptions.cs
ApiKeyAuthNOptions.cs

A segunda etapa é o arquivo ApiKeyAuthN.cs com o seguinte conteúdo.

API Key Authentication — ApiKeyAuthN.cs
Implementação inicial do ApiKeyAuthN.cs

A classe AuthenticationHandler é responsável por realizar a validação e criar o Ticket de Autenticação para o cliente.

Acho que você pode adivinhar onde colocar a lógica de validação, certo? Aqui está a implementação.

HandleAuthentication - ApiKeyAuthN.cs
HandleAuthentication – ApiKeyAuthN.cs
ParseApiKey - ApiKeyAuthN.cs
ParseApiKey – ApiKeyAuthN.cs

No método ParseApiKey lemos somente a QueryString, porém poderíamos também ler do RequestHeader.

BuildPrincipal - ApiKeyAuthN.cs
BuildPrincipal – ApiKeyAuthN.cs

Aqui deixo uma implementação básica do método BuildPrincipal. O resto deixo para você desenvolver.

Neste método devemos personalizar o  ClaimIdentity com os Claims que são necessários ao seu cliente, como Role, PhoneNumber, Issuer, Partner Id, entre outros.

Concluindo – Falta pouco agora

Já temos tudo que precisamos para iniciar com a autenticação API Key.

Abra o arquivo Startup.cs e adicione o seguinte conteúdo.

ConfigureServices - Startup.cs
ConfigureServices – Startup.cs

No método AddScheme configuramos o serviço de autenticação para utilizar o nosso manipulador de autenticação.

Nossa API Key aqui é “Hello-World“. Iremos utilizá-la em nossos testes a seguir.

A seguir iremos configurar o método Configure para usar os middlewares de autenticação e autorização nativos.

API Key Authentication - Configure - Startup.cs
Configure – Startup.cs

Adicionamos o método WriteClaims. Com ele iremos visualizar as Claims do usuário.

Executando a solução

Chamada na Rota "/" SEM Api Key.
Chamada na Rota “/” SEM Api Key.
Chamada na Rota "/" COM Api Key.
Chamada na Rota “/” COM Api Key.

SUCESSO!!!

Tornando-o ainda mais fácil para o Startup

Agora vamos criar um método builder de extensão para configurar nosso manipulador AddApiKey. Ai sim podemos utilizar aquelas três linhas que mencionamos no início do artigo.

Crie o arquivo ApiKeyAuthNExtensions.cs com o seguinte conteúdo.

ApiKeyAuthNExtensions.cs
ApiKeyAuthNExtensions.cs

Assim podemos utilizar o novo método de extensão AddApiKey ao invés do AddScheme.

Modifique o método Configure na classe Startup e substitua pelo novo método.

ConfigureServices - Startup.cs
ConfigureServices – Startup.cs

É isso! Espero que você tenha gostado. Deixe um comentário e diga o que achou, dificuldade, sugestões, melhorias, enfim! Até a próxima.

Não esqueça de compartilhar!

Originalmente publicado aqui

Código fonte para Download

Observação: Existe um nuget package que trás essa implementação pronta.

Ricardo de Mauro é Consultor de Sistemas na BRQ

Sobre o Autor