Configuração do logon externo da conta Microsoft com o ASP.NET Core

Por Valeriy Novytskyy e Rick Anderson

Este exemplo mostra a você como habilitar os usuários para entrarem com suas contas Microsoft corporativas, escolares ou pessoais utilizando o projeto ASP.NET Core 6.0 criado na página anterior.

Crie o aplicativo no Portal do Desenvolvedor da Microsoft

Se você não tiver uma conta Microsoft, selecione Criar uma. Depois de entrar, você será redirecionado para a página Registros de Aplicativos:

  • Selecione Novo registro.
  • Insira um Nome.
  • Selecione uma opção em Tipos de conta com suporte.
    • Por padrão, o pacote MicrosoftAccount tem suporte para os Registros de aplicativos criados utilizando as opções "Contas em qualquer diretório organizacional" ou "Contas em qualquer diretório organizacional e contas Microsoft".
    • Para utilizar outras opções, defina os membros AuthorizationEndpoint e TokenEndpoint de MicrosoftAccountOptions usados para inicializar a autenticação da conta Microsoft para as URLs exibidas na página Pontos de Extremidade do Registro de Aplicativo depois que ele for criado (disponível clicando em Pontos de Extremidade na página Visão Geral).
  • Em URI de Redirecionamento, insira a URL de desenvolvimento com o /signin-microsoft anexado. Por exemplo, https://localhost:5001/signin-microsoft. O esquema de autenticação da Microsoft configurado posteriormente neste exemplo tratará automaticamente as solicitações na rota /signin-microsoft para implementar o fluxo do OAuth.
  • Escolha Registrar

Criar o segredo do cliente

  • No painel esquerdo, selecione Certificados e segredos.
  • Em Segredos do cliente, selecione Novo segredo do cliente
    • Adicione uma descrição para o segredo do cliente.
    • Selecione o botão Adicionar.
  • Em Segredos do cliente, copie o valor do segredo do cliente.

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

Armazenar a ID e o segredo do cliente da Microsoft

Armazene configurações confidenciais, como a ID do aplicativo (cliente) da Microsoft encontrada na página Visão geral do registro do aplicativo e o segredo do cliente que você criou na Página de certificados e segredos 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:Microsoft:ClientId e Authentication:Microsoft:ClientSecret:

    dotnet user-secrets set "Authentication:Microsoft:ClientId" "<client-id>"
    dotnet user-secrets set "Authentication:Microsoft: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 :

Configure a Autenticação da conta Microsoft

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

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

services.AddAuthentication().AddMicrosoftAccount(microsoftOptions =>
    {
        microsoftOptions.ClientId = configuration["Authentication:Microsoft:ClientId"];
        microsoftOptions.ClientSecret = configuration["Authentication:Microsoft:ClientSecret"];
    });

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.

Para obter mais informações sobre as opções de configuração que têm suporte para a autenticação da conta Microsoft, confira a referência da API MicrosoftAccountOptions. Você pode utilizar isso para solicitar informações diferentes sobre o usuário.

Entrar com uma conta Microsoft

  • Execute o aplicativo e selecione Entrar. Uma opção para você entrar com a Microsoft aparecerá.
  • Selecione para entrar com a Microsoft. Você será redirecionado para a Microsoft para fazer a autenticação. Depois de entrar com a sua conta Microsoft, você será solicitado a permitir que o aplicativo acesse as suas informações:
  • Selecione Sim. Você será redirecionado de volta ao site, onde poderá definir seu email.

Agora você está conectado utilizando suas credenciais da Microsoft.

Vários provedores de autenticação

Quando o aplicativo exigir vários provedores, encadeie os métodos de extensão do provedor atrás de AddAuthentication:

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

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

  • Se o provedor da conta Microsoft redirecionar você para uma página de erro ao entrar, observe os parâmetros da cadeia de caracteres do título e da descrição do erro diretamente após # (hashtag) no Uri.

    Embora a mensagem de erro pareça indicar um problema com a autenticação da Microsoft, a causa mais comum é o Uri do seu aplicativo não corresponder a nenhum dos URIs de Redirecionamento especificados para a plataforma Web.

  • Se Identity não for configurado chamando services.AddIdentity em ConfigureServices, a tentativa de autenticação resultará em ArgumentException: a opção 'SignInScheme' deve ser fornecida. O modelo de projeto utilizado neste exemplo certifica-se de que isso seja feito.

  • Se o banco de dados do site não tiver sido criado com o aplicativo da migração inicial, você receberá o erro Falha na operação do banco de dados ao processar a solicitação. Toque em Aplicar migrações para criar o banco de dados e atualize para continuar após o erro.

Próximas etapas

  • Esse artigo mostrou como você pode se autenticar com a Microsoft. Você pode seguir uma abordagem semelhante para se autenticar com outros provedores listados na página anterior.
  • Depois que você publicar seu site no aplicativo Web do Azure, crie um novo segredo de cliente no Portal do desenvolvedor da Microsoft.
  • Defina Authentication:Microsoft:ClientId e Authentication:Microsoft:ClientSecret como configurações do aplicativo no portal do Azure. O sistema de configuração está configurado para fazer a leitura das chaves das variáveis de ambiente.

Este exemplo mostra a você como habilitar os usuários para entrar com a conta Microsoft corporativa, escolar ou pessoal utilizando o projeto ASP.NET Core 3.0 criado na página anterior.

Crie o aplicativo no Portal do Desenvolvedor da Microsoft

Se você não tiver uma conta Microsoft, selecione Criar uma. Depois de entrar, você será redirecionado para a página Registros de Aplicativos:

  • Selecione Novo registro.
  • Insira um Nome.
  • Selecione uma opção em Tipos de conta com suporte.
    • Por padrão, o pacote MicrosoftAccount tem suporte para os Registros de aplicativos criados utilizando as opções "Contas em qualquer diretório organizacional" ou "Contas em qualquer diretório organizacional e contas Microsoft".
    • Para utilizar outras opções, defina os membros AuthorizationEndpoint e TokenEndpoint de MicrosoftAccountOptions usados para inicializar a autenticação da conta Microsoft para as URLs exibidas na página Pontos de Extremidade do Registro de Aplicativo depois que ele for criado (disponível clicando em Pontos de Extremidade na página Visão Geral).
  • Em URI de Redirecionamento, insira a URL de desenvolvimento com o /signin-microsoft anexado. Por exemplo, https://localhost:5001/signin-microsoft. O esquema de autenticação da Microsoft configurado posteriormente neste exemplo tratará automaticamente as solicitações na rota /signin-microsoft para implementar o fluxo do OAuth.
  • Escolha Registrar

Criar o segredo do cliente

  • No painel esquerdo, selecione Certificados e segredos.
  • Em Segredos do cliente, selecione Novo segredo do cliente
    • Adicione uma descrição para o segredo do cliente.
    • Selecione o botão Adicionar.
  • Em Segredos do cliente, copie o valor do segredo do cliente.

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

Armazenar a ID e o segredo do cliente da Microsoft

Armazene configurações confidenciais, como a ID do aplicativo (cliente) da Microsoft encontrada na página Visão geral do registro do aplicativo e o segredo do cliente que você criou na Página de certificados e segredos 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:Microsoft:ClientId e Authentication:Microsoft:ClientSecret:

    dotnet user-secrets set "Authentication:Microsoft:ClientId" "<client-id>"
    dotnet user-secrets set "Authentication:Microsoft: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 :

Configure a Autenticação da conta Microsoft

Adicionar o serviço da conta Microsoft 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().AddMicrosoftAccount(microsoftOptions =>
    {
        microsoftOptions.ClientId = Configuration["Authentication:Microsoft:ClientId"];
        microsoftOptions.ClientSecret = Configuration["Authentication:Microsoft:ClientSecret"];
    });
}

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.

Para obter mais informações sobre as opções de configuração que têm suporte para a autenticação da conta Microsoft, confira a referência da API MicrosoftAccountOptions. Você pode utilizar isso para solicitar informações diferentes sobre o usuário.

Entrar com uma conta Microsoft

Execute o aplicativo e selecione Entrar. Uma opção para você entrar com a Microsoft aparecerá. Ao selecionar a Microsoft, você será redirecionado para a Microsoft para fazer a autenticação. Depois de entrar com a sua conta Microsoft, você será solicitado a permitir que o aplicativo acesse as suas informações:

Toque em Sim e você será redirecionado de volta ao site, no qual poderá definir o seu email.

Agora você está conectado utilizando suas credenciais da Microsoft.

Vários provedores de autenticação

Quando o aplicativo exigir vários provedores, encadeie os métodos de extensão do provedor atrás de AddAuthentication:

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

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

  • Se o provedor da conta Microsoft redirecionar você para uma página de erro ao entrar, observe os parâmetros da cadeia de caracteres do título e da descrição do erro diretamente após # (hashtag) no Uri.

    Embora a mensagem de erro pareça indicar um problema com a autenticação da Microsoft, a causa mais comum é o Uri do seu aplicativo não corresponder a nenhum dos URIs de Redirecionamento especificados para a plataforma Web.

  • Se Identity não for configurado chamando services.AddIdentity em ConfigureServices, a tentativa de autenticação resultará em ArgumentException: a opção 'SignInScheme' deve ser fornecida. O modelo de projeto utilizado neste exemplo certifica-se de que isso seja feito.

  • Se o banco de dados do site não tiver sido criado com o aplicativo da migração inicial, você receberá o erro Falha na operação do banco de dados ao processar a solicitação. Toque em Aplicar migrações para criar o banco de dados e atualize para continuar após o erro.

Próximas etapas

  • Esse artigo mostrou como você pode se autenticar com a Microsoft. Você pode seguir uma abordagem semelhante para se autenticar com outros provedores listados na página anterior.
  • Depois que você publicar seu site no aplicativo Web do Azure, crie um novo segredo de cliente no Portal do desenvolvedor da Microsoft.
  • Defina Authentication:Microsoft:ClientId e Authentication:Microsoft:ClientSecret como configurações do aplicativo no portal do Azure. O sistema de configuração é definido para ler chaves de variáveis de ambiente.