Compartir a través de


Introducción a la 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 al crear aplicaciones modernas para la web, el teléfono o la tableta.

Se recomienda usar la opción de autenticación segura más segura. Para las aplicaciones .NET implementadas en Azure, consulte:

Azure Key Vault y .NET Aspire proporcionan la manera más segura de almacenar y recuperar secretos. Azure Key Vault es un servicio en la nube que protege las claves de cifrado y los secretos, como certificados, cadenas de conexión y contraseñas. Para .NET Aspire, consulte la comunicación segura entre las integraciones de hospedaje y cliente (ver sección y sección).

Evite la concesión de credenciales de contraseña del propietario del recurso porque:

  • Expone la contraseña del usuario al cliente.
  • Es un riesgo de seguridad significativo.
  • Solo se debe usar cuando no se puedan usar otros flujos de autenticación.

Cuando la aplicación se implementa en un servidor de prueba, se puede usar una variable de entorno para establecer la cadena de conexión en un servidor de base de datos de prueba. Las variables de entorno generalmente se almacenan en texto sin cifrar. Si la máquina o el proceso están en peligro, las partes que no son de confianza pueden acceder a las variables de entorno. Se desaconseja el uso de variables de entorno para almacenar una cadena de conexión de producción, ya que no es el enfoque más seguro.

Directrices de datos de configuración:

  • Nunca almacene contraseñas u otros datos confidenciales en el código del proveedor de configuración o en archivos de configuración de texto sin formato.
  • No use secretos de producción en entornos de desarrollo o pruebas.
  • Especifique secretos fuera del proyecto para que no se puedan confirmar accidentalmente en un repositorio de código fuente.

Antecedentes: Pertenencia a ASP.NET

Pertenencia a ASP.NET

ASP.NET Membership fue diseñado para resolver los requisitos comunes para la pertenencia a sitios 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 permitir 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 permite 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. Usted puede escribir un proveedor para almacenar información de pertenencia en un mecanismo de almacenamiento no relacional, como Tablas de Almacenamiento de Azure, pero luego tendrá que adaptarse al diseño relacional escribiendo una gran cantidad de código y múltiples excepciones de 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.

ASP.NET Sistema de Membresía Simple

ASP.NET Simple Membership se desarrolló como un sistema de membresía para ASP.NET Web Pages. Se lanzó con WebMatrix y Visual Studio 2010 SP1. El objetivo de Simple Membership era facilitar la incorporación de funcionalidad de membresía a una aplicación de Web Pages.

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

ASP.NET proveedores universales 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 compatible con EF. Con los Universal Providers, también se simplificó considerablemente el esquema de la base de datos.

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.

identidad de ASP.NET

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 Model-View-Controller (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 la persistencia

    • De forma 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 lanzar excepciones System.NotImplementedExceptions.
  • Capacidad de prueba de unidad

    • 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 declaraciones permiten a los desarrolladores describir con mucha más precisión la identidad de un usuario que lo que permiten los roles. 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

    • Ahora, la autenticación de ASP.NET se basa en el middleware OWIN, el cual 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.

Introducción 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. Cree 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.

    imagen de la nueva ventana del proyecto asp dot Net

  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 cookies de OWIN para generar una cookie.
  3. Creación de un usuario.
    Inicie la aplicación y 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.

    imagen de creación de una cuenta

    Cuando el usuario selecciona el botón Registrar, la acción Register del controlador de cuenta crea al usuario llamando a ASP.NET Identity API, 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 cookies de OWIN son sistemas basados en reclamaciones, el framework requiere que la aplicación genere una ClaimsIdentity para el usuario. ClaimsIdentity tiene información sobre todas las reclamaciones del usuario, como los roles a los que pertenece.

  5. Cerrar 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 de FormsAuthentication.SignOut usado por el módulo FormsAuthentication en Formularios web.

Componentes de ASP.NET Identity

En el diagrama siguiente se muestran los componentes del sistema ASP.NET Identity (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.

Diagrama que muestra los componentes del sistema de identidades de A S P dot Net

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 la autenticación de formularios de ASP.NET.
  • EntityFramework
    Entity Framework es la tecnología de acceso a datos recomendada por Microsoft para bases de datos relacionales.

Migración de Membership 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