Configuração de entrada externa do Twitter com ASP.NET Core

Por Valeriy Novytskyy e Rick Anderson

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

Observação

O pacote Microsoft.AspNetCore.Authentication.Twitter descrito abaixo usa as APIs OAuth 1a fornecidas pelo Twitter. Desde então, o Twitter adicionou APIs OAuth 2 com um conjunto diferente de funcionalidades. O pacote AspNet.Security.OAuth.Twitter é uma implementação da comunidade que usa as novas APIs OAuth 2.

Criar o aplicativo no Twitter

  • Adicione o pacote NuGet Microsoft.AspNetCore.Authentication.Twitter ao projeto.

  • Navegue até o Painel do portal do desenvolvedor do Twitter e entre. Se você ainda não tiver uma conta do Twitter, use o link Inscrever-se agora para criar uma.

  • Se você não tiver um projeto, crie um.

  • Selecione + Adicionar aplicativo. Preencha o Nome do aplicativo e registre a Chave de API, o Segredo da Chave de API e o Token de Portador gerados. Serão necessários mais tarde.

  • Na página Configurações do Aplicativo, selecione Editar na seção Configurações de autenticação e:

    • Habilite o 3-legged OAuth
    • Solicitar endereço de email de usuários
    • Preencha os campos necessários e selecione Salvar

    Observação

    O Microsoft.AspNetCore.Identity exige que os usuários tenham um endereço de email por padrão. Para URLs de retorno de chamada durante o desenvolvimento, use https://localhost:{PORT}/signin-twitter, em que o espaço reservado {PORT} é a porta do aplicativo.

    Observação

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

Armazenar a chave e o segredo da API do consumidor do Twitter

Armazene configurações confidenciais, como a chave de API do consumidor do Twitter e o segredo no Gerenciador de Segredos. Para este exemplo, use as seguintes etapas:

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

  2. Armazene as configurações confidenciais no repositório de segredos local com as chaves de segredos Authentication:Twitter:ConsumerKey e Authentication:Twitter:ConsumerSecret:

    dotnet user-secrets set "Authentication:Twitter:ConsumerAPIKey" "<consumer-api-key>"
    dotnet user-secrets set "Authentication:Twitter:ConsumerSecret" "<consumer-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 :

Esses tokens podem ser encontrados na guia Chaves e Tokens de Acesso depois de criar um novo aplicativo do Twitter:

Configurar a autenticação do Twitter

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

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

    services.AddAuthentication().AddTwitter(twitterOptions =>
    {
        twitterOptions.ConsumerKey = Configuration["Authentication:Twitter:ConsumerAPIKey"];
        twitterOptions.ConsumerSecret = Configuration["Authentication:Twitter:ConsumerSecret"];
        twitterOptions.RetrieveUserDetails = true;
    });

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

services.AddAuthentication().AddTwitter(twitterOptions =>
    {
        twitterOptions.ConsumerKey = configuration["Authentication:Twitter:ConsumerAPIKey"];
        twitterOptions.ConsumerSecret = configuration["Authentication:Twitter:ConsumerSecret"];
    });

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.

Vários provedores de autenticação

Caso o aplicativo exija vários provedores, encadeie os métodos de extensão do provedor 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 Twitter, confira a referência de API TwitterOptions. Isso pode ser usado para solicitar informações diferentes sobre o usuário.

Entrar com o Twitter

Execute o aplicativo e selecione Entrar. Uma opção para entrar com o Twitter é exibida:

Selecionando redirecionamentos do Twitter para o autenticação no Twitter:

Depois de inserir suas credenciais do Twitter, você será redirecionado de volta para o site onde pode definir seu email.

Agora você está conectado usando suas credenciais do Twitter:

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.

Solução de problemas

  • Somente ASP.NET Core 2.x: se 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á uma operação de banco de dados com falha ao processar o erro de solicitação . Toque em Aplicar migrações para criar o banco de dados e atualize para continuar após o erro.

Próximas etapas

  • Este artigo mostrou como você pode se autenticar com o Twitter. Você pode seguir uma abordagem semelhante para se autenticar com outros provedores listados na página anterior.

  • Depois de publicar seu site no aplicativo Web do Azure, você deverá redefinir o ConsumerSecret no portal de desenvolvedor do Twitter.

  • Defina Authentication:Twitter:ConsumerKey e Authentication:Twitter:ConsumerSecret como configurações de aplicativo no portal do Azure. O sistema de configuração é definido para ler chaves de variáveis de ambiente.