ASP.NET Core 3.1 - Integrando com IdentityServer4
Veja como integrar o ASP.NET Core 3.1 com o protoco OpenId Connect. Neste tutorial utilizamos o IdentityServer4 como provedor de OAuth2 + OpenId Connect
Após a versão 3 do .NET Core, houve diversos breaking changes. Muitos deles relacionados a Autenticação e Autorização. Veja abaixo como criar uma aplicação ASP.NET Core MVC 3.1. Um servidor IdentityServer4 e integrar com OpenId Connect.
Pegue seu caderno e SHOW ME THE CODE!
Para esse demo será necessário:
- ASP.NET Core 3.1
- Visual Studio
O conceito por trás do código
Para saber mais sobre OAuth2, JWT e porquê utilizar o IdentityServer leia este post: Segurança - JWT x Cookies x OAuth x Bearer
Ao projeto
Neste artigo será criado um projeto para exemplificar a seguinte Arquitetura
Crie um novo projeto ASP.NET Core Web Application (File > New Project). Coloque o nome de IdentityServerWithMvc. Na tela seguinte escolha a opção Web Application (Model-View-Controller), conforme figuras abaixo:
Agora pressione o botão direito no projeto e em seguida vá até a opção Manage Nuget Packages. Procure por IdentityServer4
Configurando o Server
O server é responsável por autenticar os Users ou um Client e controlar suas claims.
QuickStart UI
É um pacote com Views e Controllers padrão, com um layout simple. Utilizado para facilitar a demo.
Para fazer download abra o Package Manager no Visual Studio (View > Other Windows > Package Manager) e execute o comando
Será feito o download de alguns pacotes.
Config.cs
Crie um novo arquivo chamado Config.cs e copie o seguinte conteúdo nele
Esse arquivo contém os parâmetros para configurar o IdentityServer.
- Users: São os usuários que se cadastraram na APP
- Client: Representa uma aplicação que pode requisitar tokens para o IdentityServer
- Resource: São os dados protegidos da sua aplicação, para conseguir acessar os Resources é preciso ter um Token válido emitido pelo Server.
IdentityServerWithMvc/Startup.cs
É preciso configurar o IdentityServer através do Startup.cs. Utilize este código:
Porta 5000
Para este exemplo a porta 5000 é utilizado, a mesma nos documentos oficiais, mas nada impede de trocar.
Pressione o botão direito em cima do projeto e vá em Properties > Debug e altere a App Url para 5000
Client
Agora que o Identity server está configurado, será configurado o client
O Client representa uma aplicação. Pode ser uma aplicação que o usuário do sistema tem acesso, uma WebApi ou site externo.
Adicionar novo projeto
No visual studio, adicione um novo projeto (pressione o botão direito na Solução e Add > New Project...). Escolha um novamente um ASP.NET Core Web Application e depois a opção Web Application (Model-View-Controller), conforme figuras abaixo:
Altere o conteúdo do Home/Index.cshtml para:
Adicione um novo componente do nuget (Botão direito no Projeto > Manage Nuget Packages), instale o pacote Microsoft.AspNetCore.Authentication.OpenIdConnect
.
MvcClient/Startup.cs
Para o projeto rodar corretamente é preciso configurar o Startup.cs
No startup foi definido o endereço do server de autenticação, é para lá que o usuário será redirecionado caso tente acessar um Resource protegido e não esteja logado.
Como é uma aplicação MVC a melhor estratégia é utilizar Cookies. Repare também que foi setado o ClientId, se esta propriedade for diferente da que foi configurado no Config.cs o IdentityServer retorna "Não Autorizado"
Para quem já utilizou o IdentityServer4 nas versões anteriores, aqui estão as diferenças:
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapDefaultControllerRoute()
.RequireAuthorization();
});
O Authentication presia estar antes de authorization. E houve uma pequa modificação para registrar as rotas Default.
Protegendo uma Rota
Crie uma nova controller chamada AdminController.cs (Botão Direito na Pasta Controller do Projeto > Add > New Controller)
Na AdminController cole o seguinte código
Adicione uma nova view para a Action Secure da Controller Admin (Botão direito em cima da chamada do método View() > Add View)
Na View, cole o seguinte código:
Esta controller, possui apenas o atributo Authorize, que irá verificar se o usuário está autenticado.
Pronto! Os projetos estão configurados. Agora para testar é preciso configurar a solution para rodar os dois projetos simultaneamente.
Veja como ficou o projeto final:
Download
O código do projeto está disponível no meu GitHub