Agregar autenticación de identidad ASP.NET MVC5 a un proyecto existente

He visto muchas páginas similares en la web, pero la mayoría utiliza un nuevo proyecto en lugar de uno existente o no tiene las funciones necesarias. Por lo tanto, tengo un proyecto MVC 5 existente y deseo integrar ASP.NET MVC5 Identity con funciones de inicio de sesión, confirmación de correo electrónico y restablecimiento de contraseña .

Además de esto, también necesito crear todas las tablas necesarias en la base de datos, es decir, usuario, roles, grupos, etc. (utilizo EF Code First en mi proyecto). ¿Hay algún artículo o muestra que corresponda a estas necesidades? Cualquier sugerencia sería apreciada. Gracias por adelantado…

Configurar la identidad de su proyecto existente no es algo difícil. Debe instalar algún paquete NuGet y hacer una pequeña configuración.

Primero instale estos paquetes NuGet en la consola del Administrador de paquetes:

 PM> Install-Package Microsoft.AspNet.Identity.Owin PM> Install-Package Microsoft.AspNet.Identity.EntityFramework PM> Install-Package Microsoft.Owin.Host.SystemWeb 

Agregue una clase de usuario y con la herencia de IdentityUser :

 public class AppUser : IdentityUser { //add your custom properties which have not included in IdentityUser before public string MyExtraProperty { get; set; } } 

Haz lo mismo para el papel:

 public class AppRole : IdentityRole { public AppRole() : base() { } public AppRole(string name) : base(name) { } // extra properties here } 

Cambie su forma DbContext a IdentityDbContext esta manera:

 public class MyDbContext : IdentityDbContext { // Other part of codes still same // You don't need to add AppUser and AppRole // since automatically added by inheriting form IdentityDbContext } 

Si usa la misma cadena de conexión y la migración permitida EF, cree las tablas necesarias para usted.

Opcionalmente, puede UserManager para agregar su configuración y personalización deseada:

 public class AppUserManager : UserManager { public AppUserManager(IUserStore store) : base(store) { } // this method is called by Owin therefore best place to configure your User Manager public static AppUserManager Create( IdentityFactoryOptions options, IOwinContext context) { var manager = new AppUserManager( new UserStore(context.Get())); // optionally configure your manager // ... return manager; } } 

Dado que Identity se basa en OWIN, también necesita configurar OWIN:

Agregue una clase a la carpeta App_Start (o en cualquier otro lugar si lo desea). Esta clase es utilizada por OWIN

 namespace MyAppNamespace { public class IdentityConfig { public void Configuration(IAppBuilder app) { app.CreatePerOwinContext(() => new MyDbContext()); app.CreatePerOwinContext(AppUserManager.Create); app.CreatePerOwinContext>((options, context) => new RoleManager( new RoleStore(context.Get()))); app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, LoginPath = new PathString("/Home/Login"), }); } } } 

Casi hecho solo agregue esta línea de código a su archivo web.config para que OWIN pueda encontrar su clase de inicio.

     

Ahora, en todo el proyecto, podría usar Identity como si VS lo hubiera instalado ya. Considere acción de inicio de sesión, por ejemplo

 [HttpPost] public ActionResult Login(LoginViewModel login) { if (ModelState.IsValid) { var userManager = HttpContext.GetOwinContext().GetUserManager(); var authManager = HttpContext.GetOwinContext().Authentication; AppUser user = userManager.Find(login.UserName, login.Password); if (user != null) { var ident = userManager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie); AuthManager.SignIn( new AuthenticationProperties { IsPersistent = false }, ident); return Redirect(login.ReturnUrl ?? Url.Action("Index", "Home")); } } ModelState.AddModelError("", "Invalid username or password"); return View(login); } 

Puede hacer roles y agregar a sus usuarios:

 public ActionResult CreateRole(string roleName) { var roleManager=HttpContext.GetOwinContext().GetUserManager>(); if (!roleManager.RoleExists(roleName)) roleManager.Create(new AppRole(roleName)); // rest of code } 

Puede agregar cualquier rol a cualquier usuario como este:

 UserManager.AddToRole(UserManager.FindByName("username").Id, "roleName"); 

Al usar Authorize usted puede proteger sus acciones o controladores:

 [Authorize] public ActionResult MySecretAction() {} 

o

 [Authorize(Roles = "Admin")]] public ActionResult MySecretAction() {} 

También podría instalar paquetes adicionales y configurarlos para cumplir con sus requisitos como Microsoft.Owin.Security.Facebook o lo que desee.

Nota: No olvide agregar espacios de nombres relevantes a sus archivos:

 using Microsoft.AspNet.Identity; using Microsoft.Owin.Security; using Microsoft.AspNet.Identity.Owin; using Microsoft.AspNet.Identity.EntityFramework; using Microsoft.Owin; using Microsoft.Owin.Security.Cookies; using Owin; 

También podría ver mis otras respuestas como esta y esto para el uso avanzado de Identidad.

Esto es lo que hice para integrar Identity con una base de datos existente.

  1. Cree un proyecto MVC de muestra con plantilla MVC. Esto tiene todo el código necesario para la implementación de Identidad: Startup.Auth.cs, IdentityConfig.cs, código del controlador de cuenta, Manage Controller, Models y vistas relacionadas.

  2. Instale los paquetes nuget necesarios para Identity y OWIN. Obtendrá una idea al ver las referencias en el Proyecto de muestra y la respuesta por @Sam

  3. Copie todos estos códigos en su proyecto existente. Tenga en cuenta que no olvide agregar la cadena de conexión “DefaultConnection” para que Identity se asigne a su base de datos. Compruebe la clase ApplicationDBContext en IdentityModel.cs donde encontrará la referencia a la cadena de conexión “DefaultConnection”.

  4. Esta es la secuencia de comandos SQL que ejecuté en mi base de datos existente para crear las tablas necesarias:

     USE ["YourDatabse"] GO /****** Object: Table [dbo].[AspNetRoles] Script Date: 16-Aug-15 6:52:25 PM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[AspNetRoles]( [Id] [nvarchar](128) NOT NULL, [Name] [nvarchar](256) NOT NULL, CONSTRAINT [PK_dbo.AspNetRoles] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO /****** Object: Table [dbo].[AspNetUserClaims] Script Date: 16-Aug-15 6:52:25 PM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[AspNetUserClaims]( [Id] [int] IDENTITY(1,1) NOT NULL, [UserId] [nvarchar](128) NOT NULL, [ClaimType] [nvarchar](max) NULL, [ClaimValue] [nvarchar](max) NULL, CONSTRAINT [PK_dbo.AspNetUserClaims] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO /****** Object: Table [dbo].[AspNetUserLogins] Script Date: 16-Aug-15 6:52:25 PM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[AspNetUserLogins]( [LoginProvider] [nvarchar](128) NOT NULL, [ProviderKey] [nvarchar](128) NOT NULL, [UserId] [nvarchar](128) NOT NULL, CONSTRAINT [PK_dbo.AspNetUserLogins] PRIMARY KEY CLUSTERED ( [LoginProvider] ASC, [ProviderKey] ASC, [UserId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO /****** Object: Table [dbo].[AspNetUserRoles] Script Date: 16-Aug-15 6:52:25 PM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[AspNetUserRoles]( [UserId] [nvarchar](128) NOT NULL, [RoleId] [nvarchar](128) NOT NULL, CONSTRAINT [PK_dbo.AspNetUserRoles] PRIMARY KEY CLUSTERED ( [UserId] ASC, [RoleId] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] GO /****** Object: Table [dbo].[AspNetUsers] Script Date: 16-Aug-15 6:52:25 PM ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[AspNetUsers]( [Id] [nvarchar](128) NOT NULL, [Email] [nvarchar](256) NULL, [EmailConfirmed] [bit] NOT NULL, [PasswordHash] [nvarchar](max) NULL, [SecurityStamp] [nvarchar](max) NULL, [PhoneNumber] [nvarchar](max) NULL, [PhoneNumberConfirmed] [bit] NOT NULL, [TwoFactorEnabled] [bit] NOT NULL, [LockoutEndDateUtc] [datetime] NULL, [LockoutEnabled] [bit] NOT NULL, [AccessFailedCount] [int] NOT NULL, [UserName] [nvarchar](256) NOT NULL, CONSTRAINT [PK_dbo.AspNetUsers] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] GO ALTER TABLE [dbo].[AspNetUserClaims] WITH CHECK ADD CONSTRAINT [FK_dbo.AspNetUserClaims_dbo.AspNetUsers_UserId] FOREIGN KEY([UserId]) REFERENCES [dbo].[AspNetUsers] ([Id]) ON DELETE CASCADE GO ALTER TABLE [dbo].[AspNetUserClaims] CHECK CONSTRAINT [FK_dbo.AspNetUserClaims_dbo.AspNetUsers_UserId] GO ALTER TABLE [dbo].[AspNetUserLogins] WITH CHECK ADD CONSTRAINT [FK_dbo.AspNetUserLogins_dbo.AspNetUsers_UserId] FOREIGN KEY([UserId]) REFERENCES [dbo].[AspNetUsers] ([Id]) ON DELETE CASCADE GO ALTER TABLE [dbo].[AspNetUserLogins] CHECK CONSTRAINT [FK_dbo.AspNetUserLogins_dbo.AspNetUsers_UserId] GO ALTER TABLE [dbo].[AspNetUserRoles] WITH CHECK ADD CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId] FOREIGN KEY([RoleId]) REFERENCES [dbo].[AspNetRoles] ([Id]) ON DELETE CASCADE GO ALTER TABLE [dbo].[AspNetUserRoles] CHECK CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetRoles_RoleId] GO ALTER TABLE [dbo].[AspNetUserRoles] WITH CHECK ADD CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetUsers_UserId] FOREIGN KEY([UserId]) REFERENCES [dbo].[AspNetUsers] ([Id]) ON DELETE CASCADE GO ALTER TABLE [dbo].[AspNetUserRoles] CHECK CONSTRAINT [FK_dbo.AspNetUserRoles_dbo.AspNetUsers_UserId] GO 
  5. Verifica y resuelve cualquier error restante y listo. Identity se encargará del rest 🙂

Recomiendo IdentityServer . Este es un proyecto de .NET Foundation y cubre muchos problemas sobre autenticación y autorización.

Visión de conjunto

IdentityServer es un componente de alojamiento y marco basado en .NET / Katana que permite implementar el inicio de sesión único y el control de acceso para aplicaciones web modernas y API que utilizan protocolos como OpenID Connect y OAuth2. Admite una amplia gama de clientes, como aplicaciones móviles, web, SPA y de escritorio, y es extensible para permitir la integración en architectures nuevas y existentes.

Para más información, p. Ej.

  • soporte para MembershipReboot y ASP.NET Identity based user stores
  • soporte para middleware de autenticación Katana adicional (p. ej., Google, Twitter, Facebook, etc.)
  • soporte para la persistencia de la configuración basada en EntityFramework
  • soporte para WS-Federation
  • extensibilidad

mira la documentación y las muestras .