Configuração de logon externo do Google no ASP.NET Core

Por Valeriy Novytskyy e Rick Anderson

Este exemplo mostra como permitir que os usuários entrem com suas contas do Google usando um projeto do ASP.NET Core criado na página anterior.

Criar a ID do cliente e o segredo do Google OAuth 2.0

  • Siga as diretrizes em Integrando o Log in do Google com o seu aplicativo Web (documentação do Google).

  • Acesse os Serviços da API do Google e Serviços.

  • Um Projeto deve existir primeiro; talvez seja necessário criar um. Depois que um projeto for selecionado, insira o Painel.

  • Na tela de consentimento do Oauth do Painel:

    • Selecione Tipo de Usuário – Externo e CRIAR.
    • Na caixa de diálogo Informações do aplicativo, forneça um nome de aplicativo para o aplicativo, email de suporte do usuário e informações de contato do desenvolvedor.
    • Percorra a etapa Escopos.
    • Percorra a etapa Testar usuários.
    • Examine a tela de consentimento do OAuth e volte para o Painel do aplicativo.
  • Na guia Credenciais do Painel do aplicativo, selecione CRIAR CREDENCIAIS>ID do cliente OAuth.

  • Selecione tipo de Aplicativo>Aplicativo Web, escolha um nome.

  • Na seção URIs de redirecionamento autorizados, selecione ADICIONAR URI para definir o URI de redirecionamento. Exemplo de URI de redirecionamento: https://localhost:{PORT}/signin-google, em que o espaço reservado {PORT} é a porta do aplicativo.

  • Selecione o botão CRIAR.

  • Salve a ID do Cliente e o Segredo do Cliente para uso na configuração do aplicativo.

  • Ao implantar o site:

    • Atualize o URI de redirecionamento do aplicativo no Console do Google para o URI de redirecionamento implantado do aplicativo.
    • Crie um novo registro de API do Google no Console do Google para o aplicativo de produção com seu URI de redirecionamento de produção.

Criar a ID do cliente e o segredo do Google

Armazene configurações confidenciais, como a ID do cliente do Google e valores do segredo com o Gerenciador de Segredos. Para este exemplo, use as seguintes etapas:

  1. Inicialize o projeto para armazenamento de segredos de acordo com as instruções em Habilitar armazenamento de segredos.

  2. Armazene as configurações confidenciais no repositório de segredos local com as chaves de segredos Authentication:Google:ClientId e Authentication:Google:ClientSecret:

    dotnet user-secrets set "Authentication:Google:ClientId" "<client-id>"
    dotnet user-secrets set "Authentication:Google:ClientSecret" "<client-secret>"
    

O separador : não funciona com chaves hierárquicas de variáveis de ambiente em todas as plataformas. __, o sublinhado duplo, tem:

  • Suporte em todas as plataformas. Por exemplo, o separador : não tem suporte pelo Bash, mas pelo __ tem.
  • Substituição automática por um :

Você pode gerenciar suas credenciais e o uso da API no Console de API.

Configurar a autenticação do Google

Adicione o Pacote NuGet Microsoft.AspNetCore.Authentication.Google ao aplicativo.

Adicione o serviço de Autenticação ao Startup.ConfigureServices:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDefaultIdentity<IdentityUser>(options =>
        options.SignIn.RequireConfirmedAccount = true)
            .AddEntityFrameworkStores<ApplicationDbContext>();
    services.AddRazorPages();

    services.AddAuthentication()
        .AddGoogle(options =>
        {
            IConfigurationSection googleAuthNSection =
                Configuration.GetSection("Authentication:Google");

            options.ClientId = googleAuthNSection["ClientId"];
            options.ClientSecret = googleAuthNSection["ClientSecret"];
        });
}

Adicione o serviço de Autenticação ao Program:

var builder = WebApplication.CreateBuilder(args);
var services = builder.Services;
var configuration = builder.Configuration;

services.AddAuthentication().AddGoogle(googleOptions =>
    {
        googleOptions.ClientId = configuration["Authentication:Google:ClientId"];
        googleOptions.ClientSecret = configuration["Authentication:Google:ClientSecret"];
    });

A chamada para AddIdentity define as configurações de esquema padrão. A sobrecarga AddAuthentication(IServiceCollection, String) define a propriedade DefaultScheme. A sobrecarga AddAuthentication(IServiceCollection, Action<AuthenticationOptions>) permite configurar opções de autenticação, que podem ser usadas para configurar esquemas de autenticação padrão para diferentes finalidades. Chamadas subsequentes para AddAuthentication substitui as propriedades AuthenticationOptions configuradas anteriormente.

Os métodos de extensão AuthenticationBuilder que registram um manipulador de autenticação só podem ser chamados uma vez por esquema de autenticação. Existem sobrecargas que permitem configurar as propriedades do esquema, o nome do esquema e o nome de exibição.

Entrar com o Google

  • Execute o aplicativo e selecione Entrar. Uma opção para entrar com o Google é exibida.
  • Selecione o botão Google, que redireciona para o Google para autenticação.
  • Depois de inserir suas credenciais do Google, você será redirecionado de volta para o site.

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.

Vários provedores de autenticação

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

services.AddAuthentication()
    .AddMicrosoftAccount(microsoftOptions => { ... })
    .AddGoogle(googleOptions => { ... })
    .AddTwitter(twitterOptions => { ... })
    .AddFacebook(facebookOptions => { ... });

Para obter mais informações sobre as opções de configuração compatíveis com a autenticação do Google, confira a referência de API GoogleOptions. Isso pode ser usado para solicitar informações diferentes sobre o usuário.

Alterar o URI de retorno de chamada padrão

O segmento de URI /signin-google é definido como o retorno de chamada padrão do provedor de autenticação do Google. Você pode alterar o URI de retorno de chamada padrão ao configurar o middleware de autenticação do Google por meio da propriedade herdada RemoteAuthenticationOptions.CallbackPath da classe GoogleOptions.

Solução de problemas

  • Se a entrada não funcionar e você não estiver recebendo erros, alterne para o modo de desenvolvimento para facilitar a depuração do problema.
  • Se o Identity não estiver configurado chamando services.AddIdentity em ConfigureServices, tentar autenticar resultará em ArgumentException: a opção "SignInScheme" deve ser fornecida. O modelo de projeto usado neste exemplo garante que o Identity esteja configurado.
  • Se o banco de dados do site não tiver sido criado aplicando a migração inicial, você obterá o erro Falha de uma operação de banco de dados ao processar uma solicitação. Selecione Aplicar Migrações para criar o banco de dados e atualizar para continuar após o erro.
  • Erro HTTP 500 depois de autenticar com êxito a solicitação pelo provedor OAuth 2.0, como o Google: consulte este problema do GitHub.
  • Como implementar a autenticação externa com o Google para o React e outros aplicativos SPA: consulte este problema do GitHub.

Próximas etapas

  • Este artigo mostrou como você pode se autenticar com o Google. Você pode seguir uma abordagem semelhante para se autenticar com outros provedores listados na página anterior.
  • Depois de publicar o aplicativo no Azure, redefina o ClientSecret no Console de API do Google.
  • Defina Authentication:Google:ClientId e Authentication:Google:ClientSecret como configurações de aplicativo no portal do Azure. O sistema de configuração é definido para ler chaves de variáveis de ambiente.