Autenticação de Facebook, Google e de provedor externo no ASP.NET Core

Por Valeriy Novytskyy e Rick Anderson

Este tutorial demonstra como criar um aplicativo ASP.NET Core, que permite aos usuários se conectarem usando o OAuth 2.0 com as credenciais de provedores de autenticação externa.

Os provedores Facebook, Twitter, Google e Microsoft são abordados nas seções a seguir e usam o projeto inicial criado neste artigo. Outros provedores estão disponíveis em pacotes de terceiros, como AspNet.Security.OAuth.Providers e AspNet.Security.OpenId.Providers.

Permitir que os usuários entrem com suas credenciais existentes:

  • É conveniente para os usuários.
  • Remove muitas das complexidades de gerenciar o processo de conexão para um terceiro.

Criar um novo projeto ASP.NET Core

  • Selecione o modelo Aplicativo Web ASP.NET Core. Selecione OK.
  • Na entrada de Tipo de autenticação, selecione Contas Individuais.

Aplicar migrações

  • Execute o aplicativo e selecione o link Registrar.
  • Insira o email e a senha para a nova conta e, em seguida, selecione Registrar.
  • Siga as instruções para aplicar as migrações.

Encaminhar informações de solicitação com um proxy ou balanceador de carga

Se o aplicativo for implantado atrás de um servidor proxy ou um balanceador de carga, algumas das informações da solicitação original podem ser encaminhadas para o aplicativo nos cabeçalhos de solicitação. Essas informações geralmente incluem o esquema de solicitação segura (https), o host e o endereço IP do cliente. Os aplicativos não leem automaticamente esses cabeçalhos de solicitação para descobrir e usar as informações da solicitação original.

O esquema é usado na geração de link que afeta o fluxo de autenticação com provedores externos. Perder o esquema de seguro (https) resulta no aplicativo gerando URLs de redirecionamento inseguros incorretos.

Use Middleware de cabeçalhos encaminhados para disponibilizar as informações da solicitação original ao aplicativo para o processamento da solicitação.

Para obter mais informações, veja Configurar o ASP.NET Core para trabalhar com servidores proxy e balanceadores de carga.

Usar o SecretManager para armazenar os tokens atribuídos por provedores de logon

Os provedores de logon social atribuem tokens de ID do Aplicativo e Segredo do Aplicativo durante o processo de registro. Os nomes de token exatos variam de acordo com o provedor. Esses tokens representam as credenciais que seu aplicativo usa para acessar a API. Os tokens constituem os "segredos do usuário" que podem ser vinculados à configuração de aplicativo com a ajuda do Secret Manager. Os segredos do usuário são uma alternativa mais segura para armazenar os tokens em um arquivo de configuração, como appsettings.json.

Importante

O Secret Manager destina-se apenas para fins de desenvolvimento. Você pode armazenar e proteger os segredos de teste e produção do Azure com o provedor de configuração do Azure Key Vault.

Siga as etapas no tópico Armazenamento seguro dos segredos do aplicativo em desenvolvimento no ASP.NET Core para armazenar os tokens atribuídos por cada provedor de logon abaixo.

Configurar os provedores de logon necessários para o aplicativo

Use os seguintes tópicos para configurar seu aplicativo para usar os respectivos provedores:

Vários provedores de autenticação

Caso o aplicativo exija vários provedores, encadeie os métodos de extensão do provedor de AddAuthentication:

using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
using WebApplication16.Data;

var builder = WebApplication.CreateBuilder(args);
var config = builder.Configuration;

var connectionString = config.GetConnectionString("DefaultConnection");
builder.Services.AddDbContext<ApplicationDbContext>(options =>
    options.UseSqlServer(connectionString));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();

builder.Services.AddDefaultIdentity<IdentityUser>(options =>
                                 options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>();
builder.Services.AddRazorPages();
builder.Services.AddControllersWithViews();

builder.Services.AddAuthentication()
   .AddGoogle(options =>
   {
       IConfigurationSection googleAuthNSection =
       config.GetSection("Authentication:Google");
       options.ClientId = googleAuthNSection["ClientId"];
       options.ClientSecret = googleAuthNSection["ClientSecret"];
   })
   .AddFacebook(options =>
   {
       IConfigurationSection FBAuthNSection =
       config.GetSection("Authentication:FB");
       options.ClientId = FBAuthNSection["ClientId"];
       options.ClientSecret = FBAuthNSection["ClientSecret"];
   })
   .AddMicrosoftAccount(microsoftOptions =>
   {
       microsoftOptions.ClientId = config["Authentication:Microsoft:ClientId"];
       microsoftOptions.ClientSecret = config["Authentication:Microsoft:ClientSecret"];
   })
   .AddTwitter(twitterOptions =>
   {
       twitterOptions.ConsumerKey = config["Authentication:Twitter:ConsumerAPIKey"];
       twitterOptions.ConsumerSecret = config["Authentication:Twitter:ConsumerSecret"];
       twitterOptions.RetrieveUserDetails = true;
   });

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseMigrationsEndPoint();
}
else
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.MapRazorPages();
app.MapDefaultControllerRoute();

app.Run();

Definir a senha opcionalmente

Ao registrar um provedor de logon externo, você não precisa ter uma senha registrada no aplicativo. Isso o alivia da tarefa de criar e lembrar de uma senha para o site, mas também o torna dependente do provedor de logon externo. Se o provedor de logon externo não estiver disponível, você não poderá se conectar ao site.

Para criar uma senha e entrar usando seu email definido durante o processo de entrada com provedores externos:

  • Selecione o link Olá,<>alias de email no canto superior direito para navegar até a exibição Gerenciar.

Web application Manage view

  • Escolha Criar

Set your password page

  • Defina uma senha válida e use-a para entrar com seu email.

Informações adicionais