Introducción a ASP.NET Identity

El sistema de pertenencia ASP.NET se introdujo con ASP.NET 2.0 en 2005 y, desde entonces, ha habido muchos cambios en las formas en que las aplicaciones web normalmente controlan la autenticación y la autorización. ASP.NET Identidad es un nuevo vistazo a lo que debe ser el sistema de pertenencia cuando se compila aplicaciones modernas para la web, el teléfono o la tableta.

Fondo: Pertenencia a ASP.NET

Pertenencia a ASP.NET

Pertenencia a ASP.NET se diseñó para resolver los requisitos de pertenencia a sitios que eran comunes en 2005, que implicaban la autenticación de formularios y una base de datos de SQL Server para nombres de usuario, contraseñas y datos de perfil. Hoy en día hay una matriz mucho más amplia de opciones de almacenamiento de datos para aplicaciones web, y la mayoría de los desarrolladores quieren habilitar que sus sitios usen proveedores de identidades sociales para la funcionalidad de autenticación y autorización. Las limitaciones del diseño de Pertenencia a ASP.NET dificultan esta transición:

  • El esquema de base de datos se diseñó para SQL Server y no se puede cambiar. Puede agregar información de perfil, pero los datos adicionales se empaquetan en una tabla diferente, lo que dificulta el acceso por cualquier medio, excepto a través de la API del proveedor de perfiles.
  • El sistema de proveedor habilita cambiar el almacén de datos de respaldo, pero el sistema está diseñado en torno a las suposiciones adecuadas para una base de datos relacional. Puede escribir un proveedor para almacenar información de pertenencia en un mecanismo de almacenamiento no relacional, como tablas de Azure Storage, pero después debe solucionar el diseño relacional escribiendo mucho código y muchas excepciones System.NotImplementedException para los métodos que no se aplican a las bases de datos NoSQL.
  • Dado que la funcionalidad de inicio de sesión o cierre de sesión se basa en la autenticación de formularios, el sistema de pertenencia no puede usar OWIN. OWIN incluye componentes de middleware para la autenticación, incluida la compatibilidad con inicios de sesión mediante proveedores de identidades externos (como cuentas de Microsoft, Facebook, Google, Twitter) e inicios de sesión con cuentas de organización de Active Directory local o Azure Active Directory. OWIN también incluye compatibilidad con OAuth 2.0, JWT y CORS.

pertenencia simple de ASP.NET

ASP.NET pertenencia simple se desarrolló como un sistema de pertenencia para ASP.NET Web Pages. Se lanzó con WebMatrix y Visual Studio 2010 SP1. El objetivo de La pertenencia simple era facilitar la adición de la funcionalidad de pertenencia a una aplicación de Páginas web.

La pertenencia simple facilitaba la personalización de la información del perfil de usuario, pero todavía comparte los otros problemas con ASP.NET Pertenencia y tiene algunas limitaciones:

  • Era difícil conservar los datos del sistema de pertenencia en un almacén no relacional.
  • No se puede usar con OWIN.
  • No funciona bien con los proveedores de ASP.NET pertenencia existentes y no es extensible.

Proveedores universales de ASP.NET

Proveedores universales de ASP.NET se desarrollaron para que sea posible conservar la información de pertenencia en Microsoft Azure SQL Database, y también funcionan con SQL Server Compact. Los proveedores universales se crearon en Entity Framework Code First, lo que significa que los proveedores universales se pueden usar para conservar los datos en cualquier almacén admitido con EF. Con los proveedores universales, el esquema de la base de datos también se limpió mucho.

Los proveedores universales se basan en la infraestructura de pertenencia de ASP.NET, por lo que siguen teniendo las mismas limitaciones que el proveedor sqlMembership. Es decir, se diseñaron para bases de datos relacionales y es difícil personalizar la información de usuario y del perfil. Estos proveedores también usan la autenticación de formularios para la funcionalidad de inicio de sesión y cierre de sesión.

ASP.NET Identity

A medida que la historia de pertenencia en ASP.NET ha evolucionado a lo largo de los años, el equipo de ASP.NET ha aprendido mucho de los comentarios de los clientes.

Suposición de que los usuarios iniciarán sesión escribiendo un nombre de usuario y una contraseña que hayan registrado en su propia aplicación ya no son válidos. La web se ha vuelto más social. Los usuarios interactúan entre sí en tiempo real a través de canales sociales como Facebook, Twitter y otros sitios web sociales. Los desarrolladores quieren que los usuarios puedan iniciar sesión con sus identidades sociales para que puedan tener una experiencia enriquecida en sus sitios web. Un sistema de pertenencia moderno debe habilitar los inicios de sesión basados en redireccionamiento a proveedores de autenticación como Facebook, Twitter y otros.

A medida que evolucionó el desarrollo web, también lo hicieron los patrones de desarrollo web. Las pruebas unitarias del código de aplicación se convirtieron en una preocupación fundamental para los desarrolladores de aplicaciones. En 2008 ASP.NET agregó un nuevo marco basado en el patrón Modelo-Vista-Controlador (MVC), en parte para ayudar a los desarrolladores a crear aplicaciones ASP.NET que se pueden probar unitarias. Los desarrolladores que querían probar unitariamente su lógica de aplicación también quería poder hacerlo con el sistema de pertenencia.

Teniendo en cuenta estos cambios en el desarrollo de aplicaciones web, ASP.NET Identity se desarrolló con los siguientes objetivos:

  • Un sistema de identidad de ASP.NET

    • ASP.NET Identity se puede usar con todos los marcos de ASP.NET, como ASP.NET MVC, Web Forms, Web Pages, Web API y SignalR.
    • ASP.NET Identidad se puede usar al compilar aplicaciones web, telefónicas, de tienda o híbridas.
  • Facilidad de conexión de datos de perfil sobre el usuario

    • Tiene control sobre el esquema de la información de usuario y perfil. Por ejemplo, puede permitir fácilmente que el sistema almacene las fechas de nacimiento introducidas por los usuarios cuando registren una cuenta en la aplicación.
  • Control de persistencia

    • De manera predeterminada, el sistema ASP.NET Identity almacena toda la información del usuario en una base de datos. ASP.NET Identity usa Entity Framework Code First para implementar todo su mecanismo de persistencia.
    • Dado que controla el esquema de la base de datos, las tareas comunes, como cambiar nombres de tabla o cambiar el tipo de datos de las claves principales, es fácil de hacer.
    • Es fácil conectar diferentes mecanismos de almacenamiento, como SharePoint, Azure Storage Table Service, bases de datos NoSQL, etc., sin tener que iniciar System.NotImplementedExceptions excepciones.
  • Comprobabilidad unitaria

    • ASP.NET Identity hace que la aplicación web sea más probable unitaria. Puede escribir pruebas unitarias para las partes de la aplicación que usan ASP.NET Identity.
  • Proveedor de roles

    • Hay un proveedor de roles que permite restringir el acceso a partes de la aplicación por roles. Puede crear fácilmente roles como "Administrador" y agregar usuarios a roles.
  • Basado en notificaciones

    • ASP.NET Identity admite la autenticación basada en notificaciones, donde la identidad del usuario se representa como un conjunto de notificaciones. Las notificaciones permiten a los desarrolladores ser mucho más expresivos en la descripción de la identidad de un usuario que los roles permitidos. Mientras que la pertenencia a roles es simplemente un booleano (miembro o no miembro), una notificación puede incluir información enriquecida sobre la identidad y la pertenencia del usuario.
  • Proveedores de registro social

    • Puede agregar fácilmente inicios de sesión sociales, como la cuenta de Microsoft, Facebook, Twitter, Google y otros usuarios a la aplicación, y almacenar los datos específicos del usuario en la aplicación.
  • Integración de OWIN

    • ASP.NET autenticación se basa ahora en el middleware OWIN que se puede usar en cualquier host basado en OWIN. ASP.NET Identity no tiene ninguna dependencia en System.Web. Es un marco OWIN totalmente compatible y se puede usar en cualquier aplicación hospedada de OWIN.
    • ASP.NET Identity usa la autenticación OWIN para iniciar sesión o cerrar sesión de los usuarios en el sitio web. Esto significa que, en lugar de usar FormsAuthentication para generar la cookie, la aplicación usa OWIN CookieAuthentication para hacerlo.
  • Paquete NuGet

    • ASP.NET Identity se redistribuye como un paquete NuGet que se instala en las plantillas de MVC, Web Forms y WEB API de ASP.NET que se incluyen con Visual Studio 2017. Puede descargar este paquete NuGet desde la galería de NuGet.
    • La publicación de ASP.NET Identity como un paquete NuGet facilita al equipo de ASP.NET iterar las nuevas características y correcciones de errores y entregarlas a los desarrolladores de forma ágil.

Comenzar a ASP.NET Identity

ASP.NET Identity se usa en las plantillas de proyecto de Visual Studio 2017 para ASP.NET MVC, Web Forms, Web API y SPA. En este tutorial, se muestra cómo las plantillas de proyecto usan ASP.NET Identity para agregar funcionalidad para registrar, iniciar sesión y cerrar sesión de un usuario.

ASP.NET Identity se implementa mediante el procedimiento siguiente. El propósito de este artículo es proporcionar información general de alto nivel de ASP.NET Identidad; puede seguirlo paso a paso o simplemente leer los detalles. Para obtener instrucciones más detalladas sobre cómo crear aplicaciones con ASP.NET Identity, incluido el uso de la nueva API para agregar usuarios, roles e información de perfil, consulte la sección Pasos siguientes al final de este artículo.

  1. Crear una aplicación ASP.NET MVC con cuentas individuales. Puede usar ASP.NET Identity en ASP.NET MVC, Web Forms, Web API, SignalR, etc. En este artículo empezaremos con una aplicación ASP.NET MVC.

    Image of new ASP dot Net project window

  2. El proyecto creado contiene los tres paquetes siguientes para ASP.NET Identity.

    • Microsoft.AspNet.Identity.EntityFramework
      Este paquete tiene la implementación de Entity Framework de ASP.NET Identity, que conservará los datos y el esquema de ASP.NET Identity en SQL Server.
    • Microsoft.AspNet.Identity.Core
      Este paquete tiene las interfaces principales de ASP.NET Identity. Este paquete se puede usar para escribir una implementación para ASP.NET identidad que tiene como destino almacenes de persistencia diferentes, como Azure Table Storage, bases de datos NoSQL, etc.
    • Microsoft.AspNet.Identity.OWIN
      Este paquete contiene la funcionalidad que se usa para conectar la autenticación OWIN con ASP.NET Identity en aplicaciones ASP.NET. Esto se usa cuando se agrega la funcionalidad de inicio de sesión a la aplicación y se llama al middleware de autenticación de Cookie de OWIN para generar una cookie.
  3. Creación de un usuario.
    Inicie la aplicación y, a continuación, haga clic en el vínculo Registrar para crear un usuario. En la imagen siguiente se muestra la página Registrar que recopila el nombre de usuario y la contraseña.

    Image of create new account

    Cuando el usuario selecciona el botón Registrar, la acción Register del controlador de cuenta crea al usuario llamando a la API de identidad de ASP.NET, como se resalta a continuación:

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser() { UserName = model.UserName };
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                await SignInAsync(user, isPersistent: false);
                return RedirectToAction("Index", "Home");
            }
            else
            {
                AddErrors(result);
            }
        }
    
        // If we got this far, something failed, redisplay form
        return View(model);
    }
    
  4. Inicie sesión.
    Si el usuario se creó correctamente, el método inicia sesión SignInAsync.

     [HttpPost]
     [AllowAnonymous]
     [ValidateAntiForgeryToken]
    public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                 await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);
                        
                 // For more information on how to enable account confirmation and password reset please visit https://go.microsoft.com/fwlink/?LinkID=320771
                 // Send an email with this link
                 // string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
                 // var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
                 // await UserManager.SendEmailAsync(user.Id, "Confirm your account", "Please confirm your account by clicking <a href=\"" + callbackUrl + "\">here</a>");
    
                 return RedirectToAction("Index", "Home");
             }
             AddErrors(result);
         }
    
        // If we got this far, something failed, redisplay form
         return View(model);
     }
    

    El método SignInManager.SignInAsync genera un ClaimsIdentity. Dado que ASP.NET Identity y la autenticación de Cookie OWIN son un sistema basado en notificaciones, el marco requiere que la aplicación genere claimsIdentity para el usuario. ClaimsIdentity tiene información sobre todas las notificaciones del usuario, como los roles a los que pertenece el usuario.

  5. Cierre la sesión.
    Seleccione el vínculo Cerrar sesión para llamar a la acción LogOff en el controlador de cuenta.

    // POST: /Account/LogOff
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult LogOff()
    {
        AuthenticationManager.SignOut();
        return RedirectToAction("Index", "Home");
    }
    

    El código resaltado anterior muestra el método AuthenticationManager.SignOut OWIN. Esto es análogo al método FormsAuthentication.SignOut usado por el módulo FormsAuthentication en Web Forms.

Componentes de ASP.NET Identity

En el diagrama siguiente se muestran los componentes del sistema de identidad de ASP.NET (seleccione en este o en el diagrama para ampliarlo). Los paquetes en verde componen el sistema ASP.NET Identity. Todos los demás paquetes son dependencias necesarias para usar el sistema ASP.NET Identity en ASP.NET aplicaciones.

Diagram showing the components of the A S P dot Net identity system

A continuación se muestra una breve descripción de los paquetes NuGet que no se han mencionado anteriormente:

  • Microsoft.Owin.Security.Cookies
    Middleware que permite a una aplicación usar la autenticación basada en cookies, similar a ASP. Autenticación de formularios de NET.
  • EntityFramework
    Entity Framework es la tecnología de acceso a datos recomendada por Microsoft para bases de datos relacionales.

Migración de la pertenencia a ASP.NET Identity

Esperamos proporcionar pronto instrucciones sobre la migración de las aplicaciones existentes que usan ASP.NET Pertenencia o Pertenencia simple al nuevo sistema de identidad de ASP.NET.

Pasos siguientes