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