Hinzufügen der ASP.NET MVC5-Identitätsauthentifizierung zu einem vorhandenen Projekt

164

Ich habe viele ähnliche Seiten im Web gesehen, aber die meisten verwenden ein neues Projekt anstelle eines vorhandenen oder verfügen nicht über die erforderlichen Funktionen. Ich habe also ein vorhandenes MVC 5Projekt und möchte ASP.NET MVC5 Identity mit Anmelde-, E-Mail-Bestätigungs- und Kennwortrücksetzfunktionen integrieren .

Darüber hinaus muss ich alle erforderlichen Tabellen in der Datenbank erstellen, z. B. Benutzer, Rollen, Gruppen usw. (ich verwende EF Code First in meinem Projekt). Gibt es einen Artikel oder ein Beispiel, das diesen Anforderungen entspricht? Jeder Vorschlag wäre dankbar. Danke im Voraus...

Jack
quelle
Was für eine großartige Quest und was für eine einfache Lösung, die unten aufgeführt ist. Ich habe es geliebt, durchzulesen und musste dringend auch in mein bestehendes Projekt integriert werden.
Ishwor Khanal

Antworten:

281

Das Konfigurieren der Identität für Ihr vorhandenes Projekt ist keine schwierige Sache. Sie müssen ein NuGet-Paket installieren und eine kleine Konfiguration vornehmen.

Installieren Sie zuerst diese NuGet-Pakete mit der Package Manager-Konsole:

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

Fügen Sie eine Benutzerklasse und mit IdentityUserVererbung hinzu:

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

Machen Sie dasselbe für die Rolle:

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

Ändern Sie Ihre DbContextEltern von DbContextzu IdentityDbContext<AppUser>wie folgt aus :

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

Wenn Sie dieselbe Verbindungszeichenfolge verwenden und die Migration aktivieren, erstellt EF die erforderlichen Tabellen für Sie.

Optional können Sie UserManagerIhre gewünschte Konfiguration und Anpassung erweitern:

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

    // this method is called by Owin therefore this is the 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;
    }
}

Da Identity auf OWIN basiert, müssen Sie auch OWIN konfigurieren:

Fügen Sie dem App_StartOrdner eine Klasse hinzu (oder woanders, wenn Sie möchten). Diese Klasse wird von OWIN verwendet. Dies wird Ihre Startklasse sein.

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"),
            });
        }
    }
}

Fast fertig, fügen Sie einfach diese Codezeile zu Ihrer web.configDatei hinzu, damit OWIN Ihre Startklasse finden kann.

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

Jetzt können Sie im gesamten Projekt Identity verwenden, genau wie jedes neue Projekt, das bereits von VS installiert wurde. Betrachten Sie beispielsweise die Anmeldeaktion

[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);
            //use the instance that has been created. 
            authManager.SignIn(
                new AuthenticationProperties { IsPersistent = false }, ident);
            return Redirect(login.ReturnUrl ?? Url.Action("Index", "Home"));
        }
    }
    ModelState.AddModelError("", "Invalid username or password");
    return View(login);
}

Sie können Rollen erstellen und Ihren Benutzern hinzufügen:

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

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

Sie können einem Benutzer auch eine Rolle hinzufügen, wie folgt:

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

Durch die Verwendung können AuthorizeSie Ihre Aktionen oder Controller schützen:

[Authorize]
public ActionResult MySecretAction() {}

oder

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

Sie können auch zusätzliche Pakete installieren und so konfigurieren, dass sie Ihren Anforderungen entsprechen Microsoft.Owin.Security.Facebookoder wie Sie möchten.

Hinweis: Vergessen Sie nicht, Ihren Dateien relevante Namespaces hinzuzufügen:

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;

Sie können auch meine anderen Antworten wie diese und diese für die erweiterte Verwendung von Identität sehen.

Sam Farajpour Ghamari
quelle
2
Beide Lösungen sehen ähnlich aus. Ich habe den Rollenmanager von AppRoleIdentity verwendet, um Benutzer zu klassifizieren. Und da Roles und RoleManagerbereits von Identity selbst implementiert wurden, müssen Sie bereits implementierten Code nicht neu schreiben. Ich werde den Beitrag aktualisieren, um Ihnen zu zeigen, wie Sie Rollen verwenden können. Und wie ich bereits sagte, müssen Sie nur add AppUserund AppRoleEntitäten hinzufügen , um die Identität zu initialisieren. Indem Sie Ihre DbContextvon IdentityDbContext<AppUser>allen erforderlichen Tabellen erben, fügen Sie Ihre Tabelle hinzu. Sie müssen nichts tun, nur die Migration aktivieren.
Sam Farajpour Ghamari
2
Ich habe gerade eine Beispielverwendung hinzugefügt. Installieren Sie Microsoft.AspNet.Identity.EntityFrameworkauf Ihrer Domain und anderen für die Benutzeroberfläche.
Sam Farajpour Ghamari
2
1) Mach dir keine Sorgen um deine web.config. Ersetzen Sie nicht die alte. Lesen Sie dies für weitere Informationen . Ich denke, Ihre MVC hat auch aktualisiert.
Sam Farajpour Ghamari
1
2) Du hast es richtig gemacht. 3) kein Problem. Sie haben 5 neue Tabelle AspNetRoles AspNetUserClaims AspNetUserLogins AspNetUserRolesundAspNetUsers
Sam Farajpour Ghamari
3
Ich habe gerade alle Kommentare gelesen, die du hinterlassen hast, um Clint Eastwood zu helfen, Nice Job !! Die Welt braucht mehr Menschen wie Sie plusOne
Chef_Code
24

Dies habe ich getan, um Identity in eine vorhandene Datenbank zu integrieren.

  1. Erstellen Sie ein MVC-Beispielprojekt mit einer MVC-Vorlage. Hier finden Sie den gesamten Code, der für die Identitätsimplementierung erforderlich ist - Startup.Auth.cs, IdentityConfig.cs, Account Controller-Code, Manage Controller, Modelle und verwandte Ansichten.

  2. Installieren Sie die erforderlichen Nuget-Pakete für Identity und OWIN. Sie erhalten eine Vorstellung, indem Sie die Referenzen im Beispielprojekt und die Antwort von @Sam sehen

  3. Kopieren Sie den gesamten Code in Ihr vorhandenes Projekt. Bitte vergessen Sie nicht, die Verbindungszeichenfolge "DefaultConnection" hinzuzufügen, damit Identity Ihrer Datenbank zugeordnet werden kann. Überprüfen Sie die ApplicationDBContext-Klasse in IdentityModel.cs, wo Sie den Verweis auf die Verbindungszeichenfolge "DefaultConnection" finden.

  4. Dies ist das SQL-Skript, das ich in meiner vorhandenen Datenbank ausgeführt habe, um die erforderlichen Tabellen zu erstellen:

    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. Überprüfen und beheben Sie alle verbleibenden Fehler und Sie sind fertig. Identität wird den Rest erledigen :)

Shyamal Parikh
quelle
1
Vielen Dank für Ihre Antwort und nette Erklärungen. Eigentlich denke ich über einen anderen Ansatz nach, aber ich werde es auch versuchen. Gewählt +
Jack
2
Ich denke, dies ist ein viel sauberer Ansatz
Niico
3
Zusätzlich zur Startup.Auth.cs-Klasse müssen Sie die Startup.cs kopieren, die sich im Stammverzeichnis des Beispielprojekts befindet.
Padmika
Shyamal, kannst du die Startup.cs aus @ Padmikas Kommentar hinzufügen? Das ist wichtig.
Mike
4

Ich empfehle IdentityServer. Dies ist ein .NET Foundation- Projekt und behandelt viele Probleme bei der Authentifizierung und Autorisierung.

Überblick

IdentityServer ist ein .NET / Katana-basiertes Framework und eine hostbare Komponente, mit der Single Sign-On und Zugriffskontrolle für moderne Webanwendungen und APIs mithilfe von Protokollen wie OpenID Connect und OAuth2 implementiert werden können. Es unterstützt eine Vielzahl von Clients wie Mobile, Web, SPAs und Desktop-Anwendungen und ist erweiterbar, um die Integration in neue und vorhandene Architekturen zu ermöglichen.

Für weitere Informationen, z

  • Unterstützung für auf MembershipReboot und ASP.NET Identity basierende Benutzerspeicher
  • Unterstützung für zusätzliche Katana-Authentifizierungs-Middleware (z. B. Google, Twitter, Facebook usw.)
  • Unterstützung für EntityFramework-basierte Persistenz der Konfiguration
  • Unterstützung für WS-Federation
  • Erweiterbarkeit

Schauen Sie sich die Dokumentation und die Demo an .

TotPeRo
quelle
6
Die praktische Verwendung von IdentityServer sollte berücksichtigt werden, bevor blind in eine IdentityServer-Implementierung gesprungen wird.
Hanzolo