Configuración del inicio de sesión externo de la cuenta de Microsoft con ASP.NET Core

Por Valeriy Novytskyy y Rick Anderson

En este ejemplo se muestra cómo permitir que los usuarios inicien sesión con su cuenta profesional, educativa o personal de Microsoft mediante el proyecto de ASP.NET Core 6.0 creado en la página anterior.

Creación de la aplicación en el Portal para desarrolladores de Microsoft

Si no tiene una cuenta Microsoft, seleccione Crear una. Después de iniciar sesión, se le redirigirá a la página de Registros de aplicaciones:

  • Seleccione Nuevo registro.
  • Escriba un nombre.
  • Seleccione una opción para Tipos de cuenta admitidos.
    • El paquete de MicrosoftAccount es compatible de manera predeterminada con los registros de aplicaciones creados usando las opciones "Cuentas en cualquier directorio de la organización" o "Cuentas en cualquier directorio de la organización y cuentas de Microsoft".
    • Para usar otras opciones, establezca los miembros AuthorizationEndpoint y TokenEndpoint de MicrosoftAccountOptions utilizados para inicializar la autenticación de la cuenta de Microsoft en las URL mostradas en la página Puntos de conexión del Registro de la aplicación tras su creación (disponible haciendo clic en Puntos de conexión en la página Información general).
  • En URI de redirección, escriba la dirección URL de desarrollo con /signin-microsoft anexado. Por ejemplo: https://localhost:5001/signin-microsoft. El esquema de autenticación de Microsoft configurado más adelante en este ejemplo controlará automáticamente las solicitudes en la ruta de /signin-microsoft para implementar el flujo de OAuth.
  • Seleccione Registrar.

Creación de un secreto de cliente

  • En el panel izquierdo, seleccione Certificados y secretos.
  • En Secretos de cliente, seleccione Nuevo secreto de cliente.
    • Agregue una descripción para el secreto de cliente.
    • Seleccione el botón Agregar.
  • En Secretos de cliente, copie el valor del secreto de cliente.

El segmento de URI /signin-microsoft se establece como la devolución de llamada predeterminada del proveedor de autenticación de Microsoft. Puede cambiar el URI de devolución de llamada predeterminado al configurar el middleware de autenticación de Microsoft a través de la propiedad heredada RemoteAuthenticationOptions.CallbackPath de la clase de MicrosoftAccountOptions.

Almacenar el id. de cliente de Microsoft y el secreto

Almacene configuraciones confidenciales como el Id. de la aplicación (cliente) de Microsoft que se encuentra en la página Información general del registro de la aplicación y el Secreto del cliente que creó en la página Secretos y certificados con el Administrador de secretos. Para este ejemplo, siga estos pasos:

  1. Inicialice el proyecto para el almacenamiento de secretos según las instrucciones de Habilitar el almacenamiento de secretos.

  2. Almacene la configuración confidencial en el almacén de secretos local con las claves de secretos Authentication:Microsoft:ClientId y Authentication:Microsoft:ClientSecret:

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

El separador : no funciona con claves jerárquicas de variables de entorno en todas las plataformas. __, el carácter de subrayado doble, tiene las siguientes características:

  • Es compatible con todas las plataformas. Por ejemplo, el separador : no es compatible con Bash, pero __ sí.
  • Se reemplaza automáticamente por un signo :.

Configurar la autenticación de la cuenta Microsoft

Agregue el servicio de autenticación al 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"];
    });

La sobrecarga de AddAuthentication(IServiceCollection, String) establece la propiedad DefaultScheme. La sobrecarga de AddAuthentication(IServiceCollection, Action<AuthenticationOptions>) permite configurar las opciones de autenticación, que se pueden usar para configurar esquemas de autenticación predeterminados con distintos fines. Las llamadas posteriores a AddAuthentication invalidan las propiedades AuthenticationOptions previamente configuradas.

Los métodos de extensión de AuthenticationBuilder que registran un controlador de autenticación solo se pueden llamar una vez por esquema de autenticación. Existen sobrecargas que permiten configurar las propiedades del esquema, el nombre del esquema y el nombre para mostrar.

Para obtener más información sobre las opciones de configuración admitidas por la autenticación de cuenta de Microsoft, consulte la referencia de API MicrosoftAccountOptions. Esto se puede usar para solicitar información diferente sobre el usuario.

Inicio de sesión con la cuenta Microsoft

  • Ejecute la aplicación y seleccione Iniciar sesión. Aparece una opción para iniciar sesión con Microsoft.
  • Seleccione esta opción para iniciar sesión con Microsoft. Se le redirigirá a Microsoft para la autenticación. Después de iniciar sesión con su cuenta Microsoft, se le pedirá que permita que la aplicación acceda a su información:
  • Seleccione . Se le redirigirá de vuelta al sitio web donde puede establecer el correo electrónico.

Ahora ha iniciado sesión con sus credenciales de Microsoft.

Varios proveedores de autenticación

Cuando la aplicación requiera varios proveedores, encadene los métodos de extensión del proveedor de AddAuthentication:

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

Reenvío de información de solicitud con un servidor proxy o un equilibrador de carga

Si la aplicación se implementa detrás de un servidor proxy o de un equilibrador de carga, parte de la información de solicitud original podría reenviarse a la aplicación en los encabezados de solicitud. Normalmente, esta información incluye el esquema de solicitud seguro (https), el host y la dirección IP del cliente. Las aplicaciones no leen automáticamente estos encabezados de solicitud para detectar y usar la información de solicitud original.

El esquema se usa en la generación de vínculos que afecta al flujo de autenticación con proveedores externos. El resultado de perder el esquema seguro (https) es que la aplicación genera direcciones URL incorrectas poco seguras.

Use middleware de encabezados reenviados para que la información de solicitud original esté disponible para la aplicación para procesar las solicitudes.

Para más información, vea Configurar ASP.NET Core para trabajar con servidores proxy y equilibradores de carga.

Solución de problemas

  • Si el proveedor de cuentas de Microsoft le redirige a una página de error de inicio de sesión, anote los parámetros de cadena de consulta de título y descripción del error directamente después de la # (almohadilla) en el URI.

    Aunque el mensaje de error parece indicar un problema con la autenticación de Microsoft, la causa más común es que el URI de la aplicación no coincida con ninguno de los URI de redirección especificados para la plataforma web .

  • Si Identity no se configura llamando a services.AddIdentity en ConfigureServices, al intentar autenticarse se producirá una ArgumentException: La opción 'SignInScheme' debe proporcionarse. La plantilla de proyecto usada en este ejemplo garantiza que esto se realiza.

  • Si la base de datos del sitio no se ha creado aplicando la migración inicial, se produce un error Se ha producido un error en una operación de base de datos al procesar la solicitud. Pulse Aplicar migraciones para crear la base de datos y actualizar para omitir el error y continuar.

Pasos siguientes

  • En este artículo se muestra cómo puede autenticarse con Microsoft. Puede seguir un enfoque similar para autenticarse con otros proveedores enumerados en la página anterior.
  • Una vez que publique el sitio web en la aplicación web de Azure, cree un nuevo secreto de cliente en el Portal para desarrolladores de Microsoft.
  • Establezca Authentication:Microsoft:ClientId y Authentication:Microsoft:ClientSecret como configuración de la aplicación en Azure Portal. El sistema de configuración se configura para leer las claves de las variables de entorno.

En este ejemplo se muestra cómo permitir que los usuarios inicien sesión con su cuenta profesional, educativa o personal de Microsoft mediante el proyecto de ASP.NET Core 3.0 creado en la página anterior.

Creación de la aplicación en el Portal para desarrolladores de Microsoft

Si no tiene una cuenta Microsoft, seleccione Crear una. Después de iniciar sesión, se le redirigirá a la página de Registros de aplicaciones:

  • Seleccione Nuevo registro.
  • Escriba un nombre.
  • Seleccione una opción para Tipos de cuenta admitidos.
    • El paquete de MicrosoftAccount es compatible de manera predeterminada con los registros de aplicaciones creados usando las opciones "Cuentas en cualquier directorio de la organización" o "Cuentas en cualquier directorio de la organización y cuentas de Microsoft".
    • Para usar otras opciones, establezca los miembros AuthorizationEndpoint y TokenEndpoint de MicrosoftAccountOptions utilizados para inicializar la autenticación de la cuenta de Microsoft en las URL mostradas en la página Puntos de conexión del Registro de la aplicación tras su creación (disponible haciendo clic en Puntos de conexión en la página Información general).
  • En URI de redirección, escriba la dirección URL de desarrollo con /signin-microsoft anexado. Por ejemplo: https://localhost:5001/signin-microsoft. El esquema de autenticación de Microsoft configurado más adelante en este ejemplo controlará automáticamente las solicitudes en la ruta de /signin-microsoft para implementar el flujo de OAuth.
  • Seleccione Registrar.

Creación de un secreto de cliente

  • En el panel izquierdo, seleccione Certificados y secretos.
  • En Secretos de cliente, seleccione Nuevo secreto de cliente.
    • Agregue una descripción para el secreto de cliente.
    • Seleccione el botón Agregar.
  • En Secretos de cliente, copie el valor del secreto de cliente.

El segmento de URI /signin-microsoft se establece como la devolución de llamada predeterminada del proveedor de autenticación de Microsoft. Puede cambiar el URI de devolución de llamada predeterminado al configurar el middleware de autenticación de Microsoft a través de la propiedad heredada RemoteAuthenticationOptions.CallbackPath de la clase de MicrosoftAccountOptions.

Almacenar el id. de cliente de Microsoft y el secreto

Almacene configuraciones confidenciales como el Id. de la aplicación (cliente) de Microsoft que se encuentra en la página Información general del registro de la aplicación y el Secreto del cliente que creó en la página Secretos y certificados con el Administrador de secretos. Para este ejemplo, siga estos pasos:

  1. Inicialice el proyecto para el almacenamiento de secretos según las instrucciones de Habilitar el almacenamiento de secretos.

  2. Almacene la configuración confidencial en el almacén de secretos local con las claves de secretos Authentication:Microsoft:ClientId y Authentication:Microsoft:ClientSecret:

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

El separador : no funciona con claves jerárquicas de variables de entorno en todas las plataformas. __, el carácter de subrayado doble, tiene las siguientes características:

  • Es compatible con todas las plataformas. Por ejemplo, el separador : no es compatible con Bash, pero __ sí.
  • Se reemplaza automáticamente por un signo :.

Configurar la autenticación de la cuenta Microsoft

Agregue el servicio de cuenta Microsoft a 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"];
    });
}

La sobrecarga de AddAuthentication(IServiceCollection, String) establece la propiedad DefaultScheme. La sobrecarga de AddAuthentication(IServiceCollection, Action<AuthenticationOptions>) permite configurar las opciones de autenticación, que se pueden usar para configurar esquemas de autenticación predeterminados con distintos fines. Las llamadas posteriores a AddAuthentication invalidan las propiedades AuthenticationOptions previamente configuradas.

Los métodos de extensión de AuthenticationBuilder que registran un controlador de autenticación solo se pueden llamar una vez por esquema de autenticación. Existen sobrecargas que permiten configurar las propiedades del esquema, el nombre del esquema y el nombre para mostrar.

Para obtener más información sobre las opciones de configuración admitidas por la autenticación de cuenta de Microsoft, consulte la referencia de API MicrosoftAccountOptions. Esto se puede usar para solicitar información diferente sobre el usuario.

Inicio de sesión con la cuenta Microsoft

Ejecute la aplicación y seleccione Iniciar sesión. Aparece una opción para iniciar sesión con Microsoft. Al seleccionar en Microsoft, se le redirigirá a Microsoft para la autenticación. Después de iniciar sesión con su cuenta Microsoft, se le pedirá que permita que la aplicación acceda a su información:

Pulse y será redirigido de nuevo al sitio web donde podrá establecer su correo electrónico.

Ahora ha iniciado sesión con sus credenciales de Microsoft.

Varios proveedores de autenticación

Cuando la aplicación requiera varios proveedores, encadene los métodos de extensión del proveedor de AddAuthentication:

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

Reenvío de información de solicitud con un servidor proxy o un equilibrador de carga

Si la aplicación se implementa detrás de un servidor proxy o de un equilibrador de carga, parte de la información de solicitud original podría reenviarse a la aplicación en los encabezados de solicitud. Normalmente, esta información incluye el esquema de solicitud seguro (https), el host y la dirección IP del cliente. Las aplicaciones no leen automáticamente estos encabezados de solicitud para detectar y usar la información de solicitud original.

El esquema se usa en la generación de vínculos que afecta al flujo de autenticación con proveedores externos. El resultado de perder el esquema seguro (https) es que la aplicación genera direcciones URL incorrectas poco seguras.

Use middleware de encabezados reenviados para que la información de solicitud original esté disponible para la aplicación para procesar las solicitudes.

Para más información, vea Configurar ASP.NET Core para trabajar con servidores proxy y equilibradores de carga.

Solución de problemas

  • Si el proveedor de cuentas de Microsoft le redirige a una página de error de inicio de sesión, anote los parámetros de cadena de consulta de título y descripción del error directamente después de la # (almohadilla) en el URI.

    Aunque el mensaje de error parece indicar un problema con la autenticación de Microsoft, la causa más común es que el URI de la aplicación no coincida con ninguno de los URI de redirección especificados para la plataforma web .

  • Si Identity no se configura llamando a services.AddIdentity en ConfigureServices, al intentar autenticarse se producirá una ArgumentException: La opción 'SignInScheme' debe proporcionarse. La plantilla de proyecto usada en este ejemplo garantiza que esto se realiza.

  • Si la base de datos del sitio no se ha creado aplicando la migración inicial, se produce un error Se ha producido un error en una operación de base de datos al procesar la solicitud. Pulse Aplicar migraciones para crear la base de datos y actualizar para omitir el error y continuar.

Pasos siguientes

  • En este artículo se muestra cómo puede autenticarse con Microsoft. Puede seguir un enfoque similar para autenticarse con otros proveedores enumerados en la página anterior.
  • Una vez que publique el sitio web en la aplicación web de Azure, cree un nuevo secreto de cliente en el Portal para desarrolladores de Microsoft.
  • Establezca Authentication:Microsoft:ClientId y Authentication:Microsoft:ClientSecret como configuración de la aplicación en Azure Portal. El sistema de configuración se configura para leer las claves de las variables de entorno.