Introdução ao IdentityServer 4. Uma nova maneira de Autenticar e Autorizar no ASP.NET

30 maio

Fala Galera,

Hoje vamos falar sobre o Identity Server, uma solução open source feita para autenticar e autorizar aplicações modernas. Quando construímos nossas aplicações pensamos em utilizar as implementações e componentes mais modernos ou seja pensamos em criar aplicações modernas e ricas e por que não pensamos da mesma maneira quando precisamos usar autenticação e autorização. E neste cenário, surgiu o Identity Server, uma solução open source que implementa as autenticações mais modernas como OAuth, Single Sign On, API access entre outras implementações

E o que é o Identity Server ?

Identity Server é um framework open source, no qual já está em sua versão 4, baseado no OpenID Connect, garantindo que aplicações modernas de diferentes tecnologias possam usar um servidor de Autenticação e Autorização. Com ele é possível oferecer informações sobre uma sessão autenticada e informações do usuário que está se autenticando.

O Identity Server permite você fazer as seguintes implementações de Autenticação e Autorização:

  • Authentication as a Service
  • Single Sign-on / Sign-out
  • Access Control for APIs
  • Federation Gateway

São diversas maneiras de criar autenticações e em uma única solução open source e tudo isso alinhado ao poder de fazer customização neste servidor de autenticação.

Show me the Code!

Iremos utilizar um exemplo para criar uma autenticação para MVC, neste exemplo iremos gerar uma integração entre o ASP.NET MVC e o nosso servidor do Identity Server.

Primeiramente vamos criar uma solução simples que terão 2 projetos o primeiro projeto será um ASP.NET MVC Core e outro será o próprio Identity Server (ASP.NET MVC Core).

Configurando o IdentityServer

A configuração do Identity Server é bem simples basta adicionar alguns pacotes e tudo funciona lindamente. Com os nossos projetos já criados vamos adicionar o pacote do Identity Server conforme figura abaixo:

Vamos criar um arquivo de configuração chamado IdentityServerConfiguration.cs nele vamos provê algumas informações de como o IdentityServer irá se comportar. Com o arquivo aberto adicione o código abaixo:

public class IdentityServerConfiguration
   {
       public static IEnumerable<IdentityResource> GetIdentityResources()
       {
           return new List<IdentityResource>()
           {
               new IdentityResources.OpenId(),
               new IdentityResources.Profile()
           };
       }

       public static IEnumerable<ApiResource> GetApiResources()
       {
           return new List<ApiResource>()
           {
               new ApiResource("API", "Api Resources")
           };
       }

       public static IEnumerable<Client> GetClientScope()
       {
           return new List<Client>()
           {
               new Client()
               {
                   ClientId = "79E0C2E2-D750-45BC-8FA3-1A9D5F9F82B5",
                   ClientName = "MVC Client Access",
                   AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,

                   ClientSecrets =
                   {
                       new Secret("1234567890".Sha256())
                   },
                   AllowedScopes =
                   {
                       IdentityServerConstants.StandardScopes.OpenId,
                       IdentityServerConstants.StandardScopes.Profile,
                       "API"
                   },
                   RedirectUris = { "http://localhost:19855/signin-oidc" },

                   PostLogoutRedirectUris = { "http://localhost:19855" }
               }
           };

       }

       public static IEnumerable<TestUser> GetUsers()
       {
           yield return new TestUser()
           {
               SubjectId = "AAF38B9A-4989-4B8E-B6F5-3B6928CF36C1",
               Username = "tester_user",
               Password = "123456789",
               Claims = new List<Claim>()
               {
                   new Claim("name", "Tester User"),
               },
               
           };
       }
   }

Feito isso, vamos configurar o servidor do IdentityServer, abra o arquivo Startup.cs e adicione o código abaixo:

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    services.AddIdentityServer()
            .AddTemporarySigningCredential()
            .AddInMemoryClients(IdentityServerConfiguration.GetClientScope())
            .AddInMemoryApiResources(IdentityServerConfiguration.GetApiResources())
            .AddInMemoryIdentityResources(IdentityServerConfiguration.GetIdentityResources())
            .AddTestUsers(IdentityServerConfiguration.GetUsers().ToList());
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));

    loggerFactory.AddDebug();

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseBrowserLink();
    }
    else
    {
        app.UseExceptionHandler("/Home/Error");
    }

    app.UseIdentityServer();

    app.UseStaticFiles();

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

Esta é a configuração básica do IdentityServer para desenvolvimento e testes mas no geral não muda tanto e como podemos percebe é bastante simples.

Para testar se o nosso servidor do IdentityServer está funcionando abra o seu navegador favorito e digite a seguinte URL: http://localhost:<porta>/.well-known/openid-configuration, você deverá ver uma resposta conforme a figura abaixo:

Nosso servidor do IdentityServer está configurado com sucesso! =]

Configurando o Client MVC

Vamos agora configurar nosso aplicativo MVC, para isso vamos abrir o Startup.cs e adicionar o código abaixo:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
            loggerFactory.AddConsole(Configuration.GetSection("Logging"));
            loggerFactory.AddDebug();
            
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseBrowserLink();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
            }

            app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationScheme = "cookies",
            });

            app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
            {
                AuthenticationScheme = "oidc",
                SignInScheme = "cookies",

                Authority = "http://localhost:14035",
                PostLogoutRedirectUri = "http://localhost:19855",
                RequireHttpsMetadata = false,
                ClientId = "79E0C2E2-D750-45BC-8FA3-1A9D5F9F82B5",
                ClientSecret = "1234567890",
                ResponseType = "code id_token",
                Scope = { "API" },
                GetClaimsFromUserInfoEndpoint = true,
                SaveTokens = true
            });

            app.UseStaticFiles();
            app.UseMvcWithDefaultRoute();

        }

O principal ponto de atenção nesta integração é a configuração do “UseCookieAuthentication” e o “UseOpenIdConnectAuthentication” que seta nossa aplicação para usar o IdentityServer.

Testando a Integração

Para testar nossa integração, devemos executar as duas aplicações ao mesmo tempo, porém antes disso, devemos primeiro baixar a configuração básica de Views, Controllers e ViewModels do IdentityServer. Feito isso, nossa aplicação deixará de dar erro e conseguiremos fazer a integração corretamente.

Para fazer o download execute o comando abaixo em um powershell dentro do diretorio raiz da aplicação que está configurada o IdentityServer.

iex ((New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/IdentityServer/IdentityServer4.Quickstart.UI/dev/get.ps1'))

Como podemos ver o IdentityServer é uma ferramenta poderosa. Ele permite diversos tipos de customizações e com certeza alguma deverá atender a suas necessidades.

Esse código está disponível no meu GitHub através do link abaixo link
https://github.com/rafaelcruz-net/IdentityServer

Link documentação IdentityServer4 https://identityserver4.readthedocs.io/en/dev/index.html

Abs e até a próxima

2 Replies to “Introdução ao IdentityServer 4. Uma nova maneira de Autenticar e Autorizar no ASP.NET

  1. Bom dia Rafael,

    Estou para iniciar um projeto e tenho estudado ASP.NET Identity and IdentyServer. Porém estou em dúvida sobre qual utilizar?

    Gostaria de saber quais as vantagens em utilizar cada um deles?

    Para entender um pouco do meu cenário : Irei iniciar um projeto onde o front-end será feito em Angular ou OpenUI5(http://openui5.org). Já o hack-end pretendo fazer em ASP.NET Core(WebAPI). A minha dúvida é sobre qual sistema de segurança devo utilizar.

    A parte de WebApi permitirá a conexão do front-end que vou criar, além isto, irei disponibilizar API para que sistemas externos possam conectar.

    Você poderia me ajudar nesta dúvida?

    • Opa,

      Para esse cenário o melhor é utilizar o OpenIdConnect com JWT. Assim você consegue garantir que sua API será somente consumida por alguém devidamente autenticado.

      Abs e obrigado pela visita

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *