it-swarm.com.de

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

Ich habe viele ähnliche Seiten im Web gesehen, aber die meisten verwenden ein neues Projekt anstelle eines vorhandenen oder haben nicht die erforderlichen Funktionen. Also, ich habe ein bestehendes MVC 5 projektieren und integrieren wollen ASP.NET MVC5-Identität mit Login, E-Mail-Bestätigung und Passwort-Reset Funktionen.

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

147
Jack

Die Konfiguration der Identität für Ihr vorhandenes Projekt ist nicht schwierig. Sie müssen ein NuGet-Paket installieren und eine kleine Konfiguration vornehmen.

Installieren Sie zuerst diese NuGet-Pakete mit Package Manager Console:

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 hinzu und vererben Sie mit IdentityUser:

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

Mach dasselbe für die Rolle:

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

Ändern Sie Ihr DbContext übergeordnetes Element von DbContext in IdentityDbContext<AppUser> Wie folgt:

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 aktiviert haben, erstellt EF die erforderlichen Tabellen für Sie.

Optional können Sie UserManager erweitern, um die gewünschte Konfiguration und Anpassung hinzuzufügen:

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 eine Klasse zum Ordner App_Start Hinzu (oder an einer anderen Stelle, 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.config - Datei hinzu, damit OWIN Ihre Startklasse finden kann.

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

Jetzt können Sie Identity im gesamten Projekt wie jedes andere von VS bereits installierte Projekt verwenden. 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:

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

Mit Authorize können Sie 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, z. B. Microsoft.Owin.Security.Facebook Oder je nachdem, was 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 this und this für die erweiterte Verwendung der Identität sehen.

259

So habe ich Identity in eine vorhandene Datenbank integriert.

  1. Erstellen Sie ein Beispiel-MVC-Projekt mit einer MVC-Vorlage. Dies enthält den gesamten Code, der für die Implementierung von Identity erforderlich ist - Startup.Auth.cs, IdentityConfig.cs, Account Controller-Code, Manage Controller, Models und zugehörige Ansichten.

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

  3. Kopieren Sie diesen gesamten Code in Ihr vorhandenes Projekt. Bitte vergessen Sie nicht, die Verbindungszeichenfolge "DefaultConnection" für die Zuordnung von Identity zu Ihrer Datenbank hinzuzufügen. Überprüfen Sie die ApplicationDBContext-Klasse in IdentityModel.cs, in der 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. Den Rest erledigt die Identität :)

21
Shyamal Parikh

Ich empfehle IdentityServer . Dies ist ein . NET Foundation Projekt und behandelt viele Fragen zur Authentifizierung und Autorisierung.

Überblick

IdentityServer ist ein .NET/Katana-basiertes Framework und eine hostfähige 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 breite Palette von Clients wie Mobil-, Web-, SPA- 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 MembershipReboot- und ASP.NET Identity-basierte Benutzerspeicher
  • unterstützung für zusätzliche Katana-Authentifizierungs-Middleware (z. B. Google, Twitter, Facebook usw.)
  • unterstützung für die auf EntityFramework basierende Persistenz der Konfiguration
  • unterstützung für WS-Federation
  • erweiterbarkeit

schauen Sie sich die Dokumentation und Beispiele an.

3
TotPeRo