Configuración de inicio de sesión externo de Google en ASP.NET Core

Por Valeriy Novytskyy y Rick Anderson

En este tutorial se muestra cómo permitir que los usuarios inicien sesión con su cuenta de Google mediante el proyecto ASP.NET Core 3.0 creado en la página anterior.

Creación de un proyecto de consola de API de Google y un identificador de cliente

  • Agregue el paquete de NuGet Microsoft.AspNetCore.Authentication.Google a la aplicación.
  • Siga las instrucciones de Integración de Google Sign-In en la aplicación web (documentación de Google).
  • En la página Credenciales de la consola de Google,seleccione CREATE CREDENTIALS OAuth client ID (Crear credenciales > id. de cliente de OAuth).
  • En el cuadro de diálogo Tipo de aplicación, seleccione Aplicación web. Proporcione un nombre para la aplicación.
  • En la sección Authorized redirect URIs (URI de redireccionamiento autorizado), seleccione ADD URI (AGREGAR URI) para establecer el URI de redirección. URI de redirección de ejemplo: https://localhost:{PORT}/signin-google , donde el marcador de posición es el puerto de la {PORT} aplicación.
  • Seleccione el botón CREAR.
  • Guarde el identificador de cliente y el secreto de cliente para usarlos en la configuración de la aplicación.
  • Al implementar el sitio, haga lo siguiente:
    • Actualice el URI de redireccionamiento de la aplicación en la consola de Google al URI de redireccionamiento implementado de la aplicación.
    • Cree un nuevo registro de Google API en la consola de Google para la aplicación de producción con su URI de redireccionamiento de producción.

Almacenamiento del identificador de cliente y el secreto de Google

Almacene la configuración confidencial, como el identificador de cliente de Google y los valores secretos con secret Manager. Para este ejemplo, siga estos pasos:

  1. Inicialice el proyecto para el almacenamiento de secretos según las instrucciones de Habilitación del almacenamiento de secretos.

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

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

Puede administrar las credenciales y el uso de la API en la consola de API.

Configuración de la autenticación de Google

Agregue el servicio de Google 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()
        .AddGoogle(options =>
        {
            IConfigurationSection googleAuthNSection =
                Configuration.GetSection("Authentication:Google");

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

La llamada a AddIdentity configura los valores de esquema predeterminados. La sobrecarga AddAuthentication (String) establece la propiedad DefaultScheme . La sobrecarga AddAuthentication (Action<AuthenticationOptions>) permite configurar las opciones de autenticación, que se pueden usar para configurar esquemas de autenticación predeterminados para propósitos diferentes. Las llamadas subsiguientes a AddAuthentication invalidan las propiedades de AuthenticationOptions configuradas previamente.

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

Inicio de sesión con Google

  • Ejecute la aplicación y haga clic en Iniciar sesión. Aparece una opción para iniciar sesión con Google.
  • Haga clic en el botón Google, que redirige a Google para la autenticación.
  • Después de escribir las credenciales de Google, se le redirigirá de nuevo al sitio web.

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 obtener más información, consulta Configuración de ASP.NET Core para trabajar con servidores proxy y equilibradores de carga.

Varios proveedores de autenticación

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

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

Consulte la GoogleOptions referencia de API para obtener más información sobre las opciones de configuración compatibles con la autenticación de Google. Se puede usar para solicitar información diferente sobre el usuario.

Cambio del URI de devolución de llamada predeterminado

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

Solución de problemas

  • Si el inicio de sesión no funciona y no se producen errores, cambie al modo de desarrollo para facilitar la depuración del problema.
  • Si no se configura mediante una llamada a en , al intentar autenticar los resultados en ArgumentException: se debe proporcionar la opción Identity services.AddIdentity ConfigureServices "SignInScheme". La plantilla de proyecto que se usa en este tutorial garantiza que esto se haga.
  • Si la base de datos del sitio no se ha creado aplicando la migración inicial, se produce un error en una operación de base de datos al procesar el error de solicitud. Seleccione Aplicar migraciones para crear la base de datos y actualice la página para continuar después del error.

Pasos siguientes

  • En este artículo se ha mostrado cómo puede autenticarse con Google. Puede seguir un enfoque similar para autenticarse con otros proveedores enumerados en la página anterior.
  • Una vez publicada la aplicación en Azure, restablezca ClientSecret en la consola de API de Google.
  • Establezca y Authentication:Google:ClientId como configuración de la aplicación en el Authentication:Google:ClientSecret Azure Portal. El sistema de configuración está configurado para leer claves de variables de entorno.