Compartir a través de


IdentityServer para aplicaciones nativas de nube

Sugerencia

Este contenido es un extracto del libro electrónico “Architecting Cloud Native .NET Applications for Azure” (Diseño de la arquitectura de aplicaciones .NET nativas en la nube para Azure), disponible en Documentos de .NET o como un PDF descargable y gratuito que se puede leer sin conexión.

Cloud Native .NET apps for Azure eBook cover thumbnail.

IdentityServer es un servidor de autenticación que implementa los estándares OpenID Connect (OIDC) y OAuth 2.0 para ASP.NET Core. Está diseñado para proporcionar una manera común de autenticar solicitudes a todas las aplicaciones, ya sean puntos de conexión web, nativos, móviles o de API. IdentityServer se puede usar para implementar inicio de sesión único (SSO) para varias aplicaciones y tipos de aplicación. Se puede usar para autenticar usuarios reales a través de formularios de inicio de sesión e interfaces de usuario similares, así como la autenticación basada en servicios que normalmente implica la emisión, comprobación y renovación de tokens sin ninguna interfaz de usuario. IdentityServer está diseñado para ser una solución personalizable. Normalmente, cada instancia se personaliza para adaptarse a las necesidades de una organización individual o de un conjunto de aplicaciones.

Escenarios comunes de aplicaciones web

Normalmente, las aplicaciones deben admitir algunos o todos los escenarios siguientes:

  • Usuarios humanos que acceden a aplicaciones web con un explorador.
  • Usuarios humanos que acceden a las API web de back-end desde aplicaciones basadas en explorador.
  • Usuarios humanos en clientes móviles o nativos que acceden a las API web de back-end.
  • Otras aplicaciones que acceden a las API web de back-end (sin una interfaz de usuario o usuario activos).
  • Cualquier aplicación puede necesitar interactuar con otras API web, mediante su propia identidad o delegando en la identidad del usuario.

Application types and scenarios

Figura 8-1. Escenarios y tipos de aplicaciones.

En cada uno de estos escenarios, la funcionalidad expuesta debe protegerse contra el uso no autorizado. Como mínimo, esto suele requerir la autenticación del usuario o la entidad de seguridad que realiza una solicitud para un recurso. Esta autenticación puede usar uno de varios protocolos comunes, como SAML2p, WS-Fed u OpenID Connect. La comunicación con las API suele usar el protocolo OAuth2 y su compatibilidad con tokens de seguridad. Separar estos aspectos críticos de seguridad transversales y sus detalles de implementación de las propias aplicaciones garantiza la coherencia y mejora la seguridad y el mantenimiento. La externalización de estos aspectos a un producto dedicado como IdentityServer ayuda al requisito de que cada aplicación resuelva estos problemas por sí misma.

IdentityServer proporciona middleware que se ejecuta dentro de una aplicación de ASP.NET Core y agrega compatibilidad con OpenID Connect y OAuth2 (consulte las especificaciones admitidas). Las organizaciones crearían su propia aplicación de ASP.NET Core mediante el middleware IdentityServer para actuar como STS para todos sus protocolos de seguridad basados en tokens. El middleware IdentityServer expone puntos de conexión para admitir la funcionalidad estándar, lo que incluye:

  • Autorizar (autenticar al usuario final)
  • Token (solicitar un token mediante programación)
  • Detección (metadatos sobre el servidor)
  • Información de usuario (obtener información de usuario con un token de acceso válido)
  • Autorización de dispositivos (se usa para iniciar la autorización de flujo de dispositivo)
  • Introspección (validación de tokens)
  • Revocación (revocación de tokens)
  • Finalizar sesión (desencadenar el cierre de sesión único en todas las aplicaciones)

Introducción

IdentityServer4 está disponible con licencia dual:

  • RPL: le permite usar identityServer4 gratis si se usa en trabajo de código abierto
  • Pago: le permite usar IdentityServer4 en un escenario comercial

Para obtener información más detallada sobre los precios, consulte la página de precios oficial.

Puede agregarlo a las aplicaciones mediante sus paquetes NuGet. El paquete principal es IdentityServer4, que se ha descargado más de cuatro millones de veces. El paquete base no incluye ningún código de interfaz de usuario y solo admite la configuración en memoria. Para usarlo con una base de datos, también querrá un proveedor de datos como IdentityServer4.EntityFramework, que usa Entity Framework Core para almacenar datos operativos y de configuración para IdentityServer. Para la interfaz de usuario, puede copiar los archivos desde el repositorio de la interfaz de usuario de inicio rápido a la aplicación ASP.NET Core MVC para agregar compatibilidad con el inicio de sesión y el cierre de sesión mediante el middleware IdentityServer.

Configuración

IdentityServer admite diferentes tipos de protocolos y proveedores de autenticación social que se pueden configurar como parte de cada instalación personalizada. Normalmente, esto se hace en la clase Program de la aplicación de ASP.NET Core (o en la clase Startup del método ConfigureServices). La configuración implica especificar los protocolos admitidos y las rutas de acceso a los servidores y puntos de conexión que se usarán. En la figura 8-2 se muestra una configuración de ejemplo tomada del proyecto de interfaz de usuario de inicio rápido IdentityServer4:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        // some details omitted
        services.AddIdentityServer();

          services.AddAuthentication()
            .AddGoogle("Google", options =>
            {
                options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;

                options.ClientId = "<insert here>";
                options.ClientSecret = "<insert here>";
            })
            .AddOpenIdConnect("demoidsrv", "IdentityServer", options =>
            {
                options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;
                options.SignOutScheme = IdentityServerConstants.SignoutScheme;

                options.Authority = "https://demo.identityserver.io/";
                options.ClientId = "implicit";
                options.ResponseType = "id_token";
                options.SaveTokens = true;
                options.CallbackPath = new PathString("/signin-idsrv");
                options.SignedOutCallbackPath = new PathString("/signout-callback-idsrv");
                options.RemoteSignOutPath = new PathString("/signout-idsrv");

                options.TokenValidationParameters = new TokenValidationParameters
                {
                    NameClaimType = "name",
                    RoleClaimType = "role"
                };
            });
    }
}

Figura 8-2. Configuración de IdentityServer.

Clientes de JavaScript

Muchas aplicaciones nativas de nube usan API del lado servidor y aplicaciones de página única de cliente enriquecidas (SPA) en el front-end. IdentityServer envía un cliente de JavaScript (oidc-client.js) a través de NPM que se puede agregar a las SPA para permitirles usar IdentityServer para iniciar sesión, cerrar sesión y la autenticación basada en tokens de las API web.

Referencias