Ajouter ASP.NET MVC5 authentification D'identité à un projet existant

j'ai vu beaucoup de pages similaires sur le web, mais la plupart d'entre eux utilisent un nouveau projet au lieu d'un existant, ou n'ont pas les caractéristiques nécessaires. Donc, j'ai un projet MVC 5 existant et je veux intégrer ASP.NET MVC5 identité avec ouverture de session, confirmation par e-mail et réinitialisation du mot de passe fonctionnalités.

en plus de cela, je dois aussi créer tous les tables nécessaires sur la base de données c.-À-D. utilisateur, rôles, groupes, etc. (J'utilise D'abord le code EF dans mon projet). Est-il un article ou l'échantillon qui correspond à ces besoins? Toute suggestion serait appréciée. Merci à l'avance...

111
demandé sur niico 2015-08-12 11:55:21

3 réponses

configurer L'identité de votre projet existant n'est pas une chose difficile. Vous devez installer un paquet NuGet et faire une petite configuration.

installez D'abord ces paquets NuGet dans la Console du Gestionnaire de paquets:

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

ajouter une classe d'utilisateur et avec IdentityUser héritage:

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

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

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

modifier votre DbContext formulaire parent DbContext à IdentityDbContext<AppUser> comme ceci:

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

si vous utilisez la même chaîne de connexion et la migration activée EF créer les tables nécessaires pour vous.

optionnellement vous pouvez étendre UserManager pour ajouter votre configuration désirée et la personnalisation:

public class AppUserManager : UserManager<AppUser>
{
    public AppUserManager(IUserStore<AppUser> store)
        : base(store)
    {
    }

    // this method is called by Owin therefore best place to configure your User Manager
    public static AppUserManager Create(
        IdentityFactoryOptions<AppUserManager> options, IOwinContext context)
    {
        var manager = new AppUserManager(
            new UserStore<AppUser>(context.Get<MyDbContext>()));

        // optionally configure your manager
        // ...

        return manager;
    }
}

puisque L'identité est basée sur OWIN vous devez configurer OWIN aussi:

ajouter une classe dans le dossier App_Start (ou n'importe où ailleurs si vous 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>(AppUserManager.Create);
            app.CreatePerOwinContext<RoleManager<AppRole>>((options, context) =>
                new RoleManager<AppRole>(
                    new RoleStore<AppRole>(context.Get<MyDbContext>())));

            app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = new PathString("/Home/Login"),
            });
        }
    }
}

presque terminé il suffit d'ajouter cette ligne de code à votre fichier web.config pour que OWIN puisse trouver votre classe de démarrage.

<appSettings>
    <!-- other setting here -->
    <add key="owin:AppStartup" value="MyAppNamespace.IdentityConfig" />
</appSettings>

maintenant dans le projet entier vous pouvez utiliser L'identité tout comme nouveau projet avait déjà installé par VS. Considérez l'action de connexion par exemple

[HttpPost]
public ActionResult Login(LoginViewModel login)
{
    if (ModelState.IsValid)
    {
        var userManager = HttpContext.GetOwinContext().GetUserManager<AppUserManager>();
        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 faire des rôles et ajouter à vos utilisateurs:

public ActionResult CreateRole(string roleName)
{
    var roleManager=HttpContext.GetOwinContext().GetUserManager<RoleManager<AppRole>>();

    if (!roleManager.RoleExists(roleName))
        roleManager.Create(new AppRole(roleName));
    // rest of code
} 

You pourrait ajouter un rôle à tout utilisateur comme ceci:

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

en utilisant Authorize vous pourriez garder vos actions ou contrôleurs:

[Authorize]
public ActionResult MySecretAction() {}

ou

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

vous pouvez également installer des paquets supplémentaires et les configurer pour répondre à vos besoins comme Microsoft.Owin.Security.Facebook ou selon votre choix.

Note: n'oubliez pas d'ajouter les 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 aussi voir mes autres réponses comme ce et ce pour une utilisation avancée de l'Identité.

216
répondu Sam Farajpour Ghamari 2017-05-23 12:02:49

C'est ce que j'ai fait pour intégrer L'identité à une base de données existante.

  1. créer un exemple de projet MVC avec le modèle MVC. Cela a tout le code nécessaire pour la mise en œuvre de L'identité - démarrage.Auth.cs, IdentityConfig.cs, Code du contrôleur de Compte, gérer le contrôleur, les modèles et les vues connexes.

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

  3. Copiez tous ces codes à votre projet existant. Veuillez noter que n'oubliez pas d'ajouter la chaîne de connexion "DefaultConnection" pour identifier votre base de données. Veuillez vérifier la classe ApplicationDBContext dans IdentityModel.cs où vous trouverez la référence à la chaîne de connexion "DefaultConnection".

  4. C'est le script SQL que j'ai lancé base de données 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 toutes les erreurs restantes et vous avez terminé. L'identité s'occupe du reste :)

15
répondu Shyamal Parikh 2015-08-18 07:53:20

je recommande IdentityServer .Il s'agit d'un .net Foundation projet et couvre de nombreuses questions sur l'authentification et l'autorisation.

vue d'ensemble

IdentityServer est un framework .net / Katana et un composant hostable qui permet de mettre en œuvre une seule connexion et un contrôle d'accès pour les applications web modernes et les API en utilisant des protocoles comme OpenID Connect et OAuth2. Il prend en charge un large éventail de clients comme mobile, web, SPAs et applications bureautiques et est extensible pour permettre l'intégration dans des architectures nouvelles et existantes.

pour plus d'informations, p.ex.

  • support for Membershippreboot and ASP.NET magasins D'identité
  • prise en charge des middlewares D'authentification Katana supplémentaires (par exemple Google, Twitter, Facebook etc)
  • soutien à la configuration
  • prise en charge de WS-Federation
  • extensibilité

découvrez les documentation et le échantillons .

3
répondu TotPeRo 2016-08-01 19:04:20