Ajout de l’authentification d’identité ASP.NET MVC5 à un projet existant

J’ai vu beaucoup de pages similaires sur le Web, mais la plupart d’entre elles utilisent un nouveau projet au lieu d’un projet existant ou n’ont pas les fonctionnalités nécessaires. J’ai donc un projet MVC 5 existant et je souhaite intégrer ASP.NET MVC5 Identity à des fonctions de connexion, de confirmation de courrier électronique et de réinitialisation de mot de passe .

En plus de cela, je dois également créer toutes les tables nécessaires sur la firebase database, à savoir l’utilisateur, les rôles, les groupes, etc. (j’utilise d’abord le code EF dans mon projet). Existe-t-il un article ou un échantillon correspondant à ces besoins? Toute suggestion serait appréciée. Merci d’avance…

Configurer l’identité de votre projet existant n’est pas une chose difficile. Vous devez installer un package NuGet et effectuer une petite configuration.

Installez d’abord ces packages NuGet dans la console du gestionnaire de packages:

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

Ajoutez une classe d’utilisateurs et avec l’inheritance IdentityUser :

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

Faites la même chose pour le rôle:

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

Changez votre DbContext parent DbContext en IdentityDbContext comme ceci:

 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 vous utilisez la même chaîne de connexion et que la migration est activée, EF crée les tables nécessaires pour vous.

Vous pouvez UserManager pour append la configuration et la personnalisation souhaitées:

 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; } } 

Identity étant basé sur OWIN, vous devez également configurer OWIN:

Ajoutez une classe au dossier App_Start (ou ailleurs si vous le souhaitez). Cette classe est utilisée par 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 PathSsortingng("/Home/Login"), }); } } } 

Presque terminé, ajoutez simplement cette ligne de code à votre fichier web.config afin que OWIN puisse trouver votre classe de démarrage.

     

Maintenant, dans tout le projet, vous pouvez utiliser Identity comme si un nouveau projet avait déjà été installé par VS. Envisagez une action de connexion, par exemple

 [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); } 

Vous pouvez créer des rôles et append à vos utilisateurs:

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

Vous pouvez append n’importe quel rôle à un utilisateur comme celui-ci:

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

En utilisant Authorize vous pouvez protéger vos actions ou vos contrôleurs:

 [Authorize] public ActionResult MySecretAction() {} 

ou

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

Vous pouvez également installer des packages supplémentaires et les configurer pour répondre à vos besoins, tels que Microsoft.Owin.Security.Facebook ou à votre guise.

Remarque: N’oubliez pas d’append des espaces de noms pertinents à vos fichiers:

 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; 

Vous pouvez également voir mes autres réponses comme ceci et ceci pour l’utilisation avancée de l’identité.

C’est ce que j’ai fait pour intégrer Identity à une firebase database existante.

  1. Créez un exemple de projet MVC avec le modèle MVC. Cela a tout le code nécessaire pour l’implémentation d’Identity – Startup.Auth.cs, IdentityConfig.cs, le code du contrôleur de compte, Manage Controller, Models et les vues associées.

  2. Installez les paquets nuget nécessaires pour Identity et OWIN. Vous aurez une idée en voyant les références dans l’exemple de projet et la réponse de @Sam

  3. Copiez tous ces codes dans votre projet existant. S’il vous plaît noter ne pas oublier d’append la chaîne de connexion “DefaultConnection” pour Identity à mapper à votre firebase database. Veuillez vérifier la classe ApplicationDBContext dans IdentityModel.cs où vous trouverez la référence à la chaîne de connexion “DefaultConnection”.

  4. Voici le script SQL que j’ai exécuté sur ma firebase database existante pour créer les tables nécessaires:

     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. Vérifiez et résolvez les erreurs restantes et vous avez terminé. L’identité s’occupera du rest 🙂

Je recommande IdentityServer . Il s’agit d’un projet .NET Foundation qui couvre de nombreuses questions relatives à l’authentification et à l’autorisation.

Vue d’ensemble

IdentityServer est un composant et un composant hostable basé sur .NET / Katana qui permet la mise en œuvre de l’authentification unique et du contrôle d’access pour les applications Web modernes et les API à l’aide de protocoles tels que OpenID Connect et OAuth2. Il prend en charge un large éventail de clients, tels que les applications mobiles, Web, SPA et de bureau, et est extensible pour permettre l’intégration dans des architectures nouvelles et existantes.

Pour plus d’informations, par exemple

  • prise en charge des magasins d’utilisateurs basés sur MembershipReboot et ASP.NET Identity
  • prise en charge de middleware d’authentification Katana supplémentaires (par exemple Google, Twitter, Facebook, etc.)
  • prise en charge de la persistance de configuration basée sur EntityFramework
  • support pour WS-Federation
  • extensibilité

consultez la documentation et les échantillons .