Mevcut bir projeye ASP.NET MVC5 Kimlik Doğrulaması Ekleme


164

Web'de birçok benzer sayfa gördüm, ancak çoğu mevcut bir proje yerine yeni bir proje kullanıyor veya gerekli özelliklere sahip değil. Yani, mevcut bir MVC 5projem var ve ASP.NET MVC5 kimliğini giriş, e-posta onayı ve şifre sıfırlama özellikleriyle entegre etmek istiyorum .

Buna ek olarak , veritabanı, Kullanıcı, Roller, gruplar, vb gerekli tüm tabloları oluşturmak gerekir . (Ben projemde EF Kodu İlk kullanın). Bu ihtiyaçlara karşılık gelen bir makale ya da örnek var mı? Her türlü önerinize açığız. Şimdiden teşekkürler...


Ne harika bir soru ve ne basit bir solutin aşağıda verilmiştir. Okumayı çok sevdim ve mevcut projeme de uyum sağlaması gerekiyordu.
Ishwor Khanal

Yanıtlar:


282

Mevcut projenize Kimlik yapılandırmak zor bir şey değildir. Bazı NuGet paketlerini kurmalı ve küçük bir yapılandırma yapmalısınız.

Önce bu NuGet paketlerini Package Manager Konsolu ile kurun:

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

IdentityUserKalıtımla bir kullanıcı sınıfı ekleyin :

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

Rol için aynı şeyi yapın:

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

Senin değiştirin DbContextgelen ebeveyn DbContextiçin IdentityDbContext<AppUser>böyle:

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

Aynı bağlantı dizesini ve etkin geçişi kullanırsanız, EF sizin için gerekli tabloları oluşturur.

İsteğe bağlı olarak, UserManageristediğiniz yapılandırmayı ve özelleştirmeyi eklemek için genişletebilirsiniz :

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

Kimlik OWIN'e dayandığından, OWIN'i de yapılandırmanız gerekir:

App_StartKlasöre (veya isterseniz başka bir yere) bir sınıf ekleyin . Bu sınıf OWIN tarafından kullanılır. Bu başlangıç ​​sınıfınız olacak.

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

Neredeyse bitti, bu kod satırını web.configdosyanıza ekleyin, böylece OWIN başlangıç ​​sınıfınızı bulabilir.

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

Şimdi tüm projede, tıpkı VS tarafından önceden kurulmuş herhangi bir yeni proje gibi Kimlik'i kullanabilirsiniz. Örneğin, giriş işlemini düşünün

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

Rol yapabilir ve kullanıcılarınıza ekleyebilirsiniz:

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

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

Ayrıca, bir kullanıcıya aşağıdaki gibi bir rol ekleyebilirsiniz:

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

Kullanarak Authorizeeylemlerinizi veya denetleyicilerinizi koruyabilirsiniz:

[Authorize]
public ActionResult MySecretAction() {}

veya

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

Ayrıca, ek paketler kurabilir ve Microsoft.Owin.Security.Facebookistediğiniz gibi veya istediğiniz gibi gereksinimlerinizi karşılayacak şekilde yapılandırabilirsiniz .

Not: Dosyalarınıza alakalı ad alanları eklemeyi unutmayın:

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;

Ayrıca böyle benim diğer cevaplar görebiliyordu bu ve bu Kimlik gelişmiş kullanım için.


2
Her iki çözüm de benzer görünüyor. Ben kullandım AppRoleve sınıflandırmak kullanıcıya Identity rol yöneticisi. Ve Kimlik tarafından zaten uygulandığından Roleve RoleManagerzaten uygulanmış kodu yeniden yazmanıza gerek yoktur. Rolleri nasıl kullanabileceğinizi göstermek için yayını güncelleyeceğim. Ve daha önce de söylediğim gibi, Kimlik'i başlatmak için sadece ekleme AppUserve AppRolevarlıklara ihtiyacınız var . Şu Verilerinizi miras olarak DbContextgelen IdentityDbContext<AppUser>tüm gerekli tablolar masanızı ekleyin. Hiçbir şeyi yapmanız gerekmez, sadece geçişi etkinleştirin.
Sam Farajpour Ghamari

2
Biraz örnek kullanım ekledim. Microsoft.AspNet.Identity.EntityFrameworkUI için Alan Adınıza ve diğer alanınıza yükleyin .
Sam Farajpour Ghamari

2
1) hakkında endişelenmeyin web.config. Eski olanı değiştirmeyin. Daha fazla bilgi için bunu okuyun . Bence MVC'niz de yükseltildi.
Sam Farajpour Ghamari

1
2) Doğru yaptın. 3) sorun değil. 5 yeni masanız olacak AspNetRoles AspNetUserClaims AspNetUserLogins AspNetUserRolesveAspNetUsers
Sam Farajpour Ghamari

3
Ben sadece Clint Eastwood, Nice Job yardım bıraktığı tüm yorumları okudum! Dünyanın Sizin gibi daha fazla insana ihtiyacı var plusOne
Chef_Code

24

Kimlik'i mevcut bir veritabanına entegre etmek için yaptığım şey bu.

  1. MVC şablonu ile örnek bir MVC projesi oluşturun. Bu, Kimlik uygulaması için gereken tüm koda sahiptir - Startup.Auth.cs, IdentityConfig.cs, Hesap Denetleyicisi kodu, Denetleyiciyi Yönet, Modeller ve ilgili görünümler.

  2. Identity ve OWIN için gerekli nuget paketlerini kurun. Örnek Projedeki referansları ve @Sam'ın cevabını görerek bir fikir edineceksiniz.

  3. Tüm bu kodları mevcut projenize kopyalayın. Kimlik'in veritabanınıza eşlenmesi için "DefaultConnection" bağlantı dizesini eklemeyi unutmayın. Lütfen "DefaultConnection" bağlantı dizesine başvuruyu bulabileceğiniz IdentityModel.cs içindeki ApplicationDBContext sınıfını kontrol edin.

  4. Bu, gerekli tabloları oluşturmak için mevcut veritabanımda çalıştırdığım SQL komut dosyasıdır:

    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. Kalan hataları kontrol edip çözün ve işiniz bitti. Kimlik gerisini halleder :)


1
Cevabınız ve güzel açıklamalar için çok teşekkürler. Aslında başka bir yaklaşım kullanmayı düşünüyorum ama bunu da deneyeceğim. Oy verildi +
Jack

2
Bence bu çok daha temiz bir yaklaşım
niico

3
Startup.Auth.cs sınıfına ek olarak, örnek projenin kökünde bulunan Startup.cs dosyasını kopyalamanız gerekir.
Padmika

Shyamal, @ Padmika'nın yorumundan Startup.cs dosyasını ekleyebilir misiniz? Bu önemli.
Mike

4

IdentityServer'ı öneriyorum.Bu bir .NET Foundation projesidir ve kimlik doğrulama ve yetkilendirme ile ilgili birçok sorunu kapsar.

genel bakış

IdentityServer, .NET / Katana tabanlı bir çerçeve ve OpenID Connect ve OAuth2 gibi protokolleri kullanarak modern web uygulamaları ve API'ler için tek oturum açma ve erişim kontrolü uygulanmasına olanak tanıyan bir bileşendir. Mobil, web, SPA ve masaüstü uygulamaları gibi çok çeşitli istemcileri destekler ve yeni ve mevcut mimarilere entegrasyon sağlamak için genişletilebilir.

Daha fazla bilgi için, ör.

  • MembershipReboot ve ASP.NET Kimlik tabanlı kullanıcı depoları için destek
  • ek Katana kimlik doğrulama ara katman yazılımı desteği (ör. Google, Twitter, Facebook vb.)
  • EntityFramework tabanlı yapılandırma kalıcılığı desteği
  • WS-Federasyonu desteği
  • uzayabilirlik

kontrol belgeleri ve demo .


6
IdentityServer uygulamasının körü körüne kullanılmadan önce pratik kullanımları göz önünde bulundurulmalıdır.
hanzolo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.