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




