.NET

5 abr, 2018

ASP.NET Core 2 – Autenticação de usuário via redes sociais

Publicidade

A nova versão do ASP.NET Core 2 implementa uma novidade em relação à autenticação do usuário. Agora, a autenticação tornou-se um único serviço, podendo, é claro, autenticar-se via login que será armazenado em algum repositório, ou ainda usando as redes sociais.

O objetivo deste artigo é mostrar como configurar a autenticação via Google, Facebook, entre outros no seu projeto ASP.NET Core 2. E, como um único serviço, você deverá apenas configurar quais provedores externos deseja.

Para simular o conteúdo, crie um projeto de ASP.NET Core 2 MVC no Visual Studio 2017 ou via linha de comando usando o “dotnet new mvc –auth Individual -f netcoreapp2.0”.

Tudo começa no arquivo Startup.cs, que é a classe a ser executada assim que a aplicação é invocada. Nela é que todas as configurações e serviços deverão ser feitas. A lista de using a ser inserida, além das que o template insere, é:

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Authentication.Cookies;
using Microsoft.AspNetCore.Authentication.OpenIdConnect;
using Microsoft.AspNetCore.Authentication.JwtBearer;

O método Configure recebe como parâmetro o IApplicationBuilder app, e você deverá invocar o UseAuthentication() para habilitar todas a capacidades conforme as configurações que iremos definir. Na listagem a seguir, suprimi alguns códigos desnecessários.

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseStaticFiles();

    app.UseAuthentication();

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

Em seguida, é preciso configurar o método ConfigureServices, que é invocado em tempo de execução. E, graças à injeção de dependência que o .Net Core permite, você pode injetar qualquer serviço que quiser. Veja que na listagem a seguir, o método recebe uma coleção de serviços do tipo IServiceCollection, onde o AddDbContext é configurado para usar o Entity Framework com o banco de dados SQL Server, e a string de conexão está na chave DefaultConnection no arquivo appsettingos.json. E o AddIdentity implementa os dados do usuário e o role no mesmo banco de dados.

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddIdentity<ApplicationUser, IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();

Como configurar o usuário em si? Em seguida, você deve configurar os dados do usuário em si, já que o IdentityOptions contém UserOptions, ClaimsIdentityOptions, PasswordOptions, LockoutOptions, SignInOptions e TokenOptions. Veja como estão setadas a senha do usuário, o Lockout e o e-mail único. Ou seja, todas as propriedades de cada tipo você pode – e deve – configurar de acordo com o nível de segurança desejado.

services.Configure<IdentityOptions>(options =>
{
    // Password settings
    options.Password.RequireDigit = true;
    options.Password.RequiredLength = 8;
    options.Password.RequireNonAlphanumeric = false;
    options.Password.RequireUppercase = true;
    options.Password.RequireLowercase = false;
    options.Password.RequiredUniqueChars = 6;

    // Lockout settings
    options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(30);
    options.Lockout.MaxFailedAccessAttempts = 10;
    options.Lockout.AllowedForNewUsers = true;

    // User settings
    options.User.RequireUniqueEmail = true;
});

Já a autenticação via provedores externos, como Facebook, Google e Microsoft, requer que a sua aplicação ASP.NET seja registrada nos sites de desenvolvedores deles (https://developers.facebook.com, https://developers.google.com), e serão geradas chaves para ClientID e ClientSecret. São exatamente essas chaves que você deverá inserir no Startup.cs, conforme a seguir.

// via facebook
services.AddAuthentication()
    .AddFacebook(options =>
    {
        options.AppId = Configuration["auth:facebook:appid"];
        options.AppSecret = Configuration["auth:facebook:appsecret"];
    });

// google
services.AddAuthentication()
    .AddGoogle(options =>
    {
        options.ClientId = Configuration["auth:google:clientid"];
        options.ClientSecret = Configuration["auth:google:clientsecret"];
    });

// MS account
services.AddAuthentication()
    .AddMicrosoftAccount(options =>
    {
        options.ClientId = Configuration["auth:microsoft:clientid"];
        options.ClientSecret = Configuration["auth:microsoft:clientsecret"];
    });

E para finalizar, veja mais dois provedores que usam JWT Bearer (JSON Web Token https://jwt.io/introduction/) e OpenID (http://openid.net/connect/), os quais têm sido bastante usados em várias aplicações. O JWT pode ser implementado em qualquer tipo de aplicação ASP.NET, independentemente da versão.

// JwtBearer autenticação
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.Audience = "http://localhost:5001/";
        options.Authority = "http://localhost:5000/";
    });

// OpenID Connect (OIDC) Authentication autenticação
services.AddAuthentication(options =>
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
    options.Authority = Configuration["auth:oidc:authority"];
    options.ClientId = Configuration["auth:oidc:clientid"];
});

Centralizar todo tipo de autenticação em um único lugar é o que permite que o ASP.NET Core 2 não seja apenas um serviço que controla isso, tornando assim a vida do desenvolvedor mais simples e segura, sem ter que ficar escrevendo códigos para cada tipo de autenticação. Nos dias atuais, onde quase todo usuário tem conta em redes sociais, nada mais justo que permitir o acesso de forma simples, rápida e confiável.

***

Artigo publicado na revista iMasters, edição #25: https://issuu.com/imasters/docs/25