किसी मौजूदा प्रोजेक्ट में ASP.NET MVC5 पहचान प्रमाणीकरण जोड़ना


164

मैंने वेब पर बहुत सारे इसी तरह के पेज देखे हैं, लेकिन उनमें से ज्यादातर एक मौजूदा प्रोजेक्ट के बजाय एक नई परियोजना का उपयोग करते हैं, या आवश्यक सुविधाएँ नहीं हैं। इसलिए, मेरे पास एक मौजूदा MVC 5परियोजना है और लॉग इन, ईमेल पुष्टि और पासवर्ड रीसेट सुविधाओं के साथ ASP.NET MVC5 पहचान को एकीकृत करना चाहते हैं ।

इसके अलावा, मुझे डेटाबेस पर सभी आवश्यक तालिकाओं को बनाने की भी आवश्यकता है , अर्थात् उपयोगकर्ता, भूमिकाएं, समूह आदि (मैं अपनी परियोजना में ईएफ कोड प्रथम का उपयोग करता हूं)। क्या कोई लेख या नमूना है जो इन आवश्यकताओं से मेल खाता है? किसी भी सुझाव का स्वागत है। अग्रिम में धन्यवाद...


एक महान खोज और क्या एक साधारण solutin नीचे दी गई है। मुझे यह पढ़ने में बहुत अच्छा लगा और मुझे अपने मौजूदा प्रोजेक्ट को भी एकीकृत करने की आवश्यकता थी।
ईशोर खानल

जवाबों:


282

अपने मौजूदा प्रोजेक्ट के लिए पहचान को कॉन्फ़िगर करना मुश्किल काम नहीं है। आपको कुछ NuGet पैकेज स्थापित करने और कुछ छोटे कॉन्फ़िगरेशन करने होंगे।

पहले पैकेज प्रबंधक कंसोल के साथ इन NuGet संकुल को स्थापित करें:

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

एक उपयोगकर्ता वर्ग और IdentityUserविरासत के साथ जोड़ें :

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

भूमिका के लिए एक ही काम करें:

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

अपने DbContextमाता-पिता DbContextको IdentityDbContext<AppUser>इस तरह से बदलें :

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

यदि आप एक ही कनेक्शन स्ट्रिंग और सक्षम माइग्रेशन का उपयोग करते हैं, तो ईएफ आपके लिए आवश्यक तालिकाओं का निर्माण करेगा।

वैकल्पिक रूप से, आप UserManagerअपने वांछित विन्यास और अनुकूलन को जोड़ने के लिए विस्तार कर सकते हैं :

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

चूंकि पहचान OWIN पर आधारित है, इसलिए आपको OWIN को भी कॉन्फ़िगर करने की आवश्यकता है:

App_Startफ़ोल्डर में एक वर्ग जोड़ें (या यदि आप चाहें तो कहीं भी)। इस वर्ग का उपयोग 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"),
            });
        }
    }
}

लगभग किया बस अपनी web.configफ़ाइल के लिए कोड की इस लाइन को जोड़ने ताकि OWIN अपने स्टार्टअप वर्ग पा सकते हैं।

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

अब पूरे प्रोजेक्ट में आप आइडेंटिटी का उपयोग कर सकते हैं, जैसे कोई नया प्रोजेक्ट पहले ही VS द्वारा स्थापित किया गया था। उदाहरण के लिए लॉगिन क्रिया पर विचार करें

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

आप भूमिकाएँ बना सकते हैं और अपने उपयोगकर्ताओं को जोड़ सकते हैं:

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

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

आप इस तरह एक उपयोगकर्ता के लिए एक भूमिका जोड़ सकते हैं:

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

उपयोग करके Authorizeआप अपने कार्यों या नियंत्रकों की रक्षा कर सकते हैं:

[Authorize]
public ActionResult MySecretAction() {}

या

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

आप अतिरिक्त पैकेज भी स्थापित कर सकते हैं और उन्हें अपनी आवश्यकता को पूरा करने के लिए कॉन्फ़िगर कर सकते हैं जैसे Microsoft.Owin.Security.Facebookआप जो भी चाहते हैं।

नोट: अपनी फ़ाइलों में प्रासंगिक नामस्थान जोड़ना न भूलें:

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;

तुम भी तरह मेरे अन्य उत्तर देख सकते हैं इस और इस पहचान के उन्नत उपयोग के लिए।


2
दोनों समाधान समान दिखते हैं। मैंने AppRoleउपयोगकर्ता को वर्गीकृत करने के लिए आइडेंटिटी के रोल मैनेजर का उपयोग किया है। और चूंकि Roles और RoleManagerपहले से ही Identity द्वारा कार्यान्वित किया गया है, इसलिए आपको पहले से लागू कोड को फिर से लिखने की आवश्यकता नहीं है। मैं आपको यह दिखाने के लिए पोस्ट अपडेट करूंगा कि आप भूमिकाओं का उपयोग कैसे कर सकते हैं। और जैसा कि मैंने आपसे पहले कहा कि आइडेंटिटी को इनिशियलाइज़ करने के लिए आपको केवल एड AppUserऔर AppRoleइकाइयाँ चाहिए। अपने सभी आवश्यक तालिकाओं DbContextसे विरासत में प्राप्त करके IdentityDbContext<AppUser>अपनी तालिका जोड़ें। आपको प्रवास को सक्षम करने के लिए कुछ भी करने की आवश्यकता नहीं है।
सैम फराजपुर घमरी

2
मैंने अभी कुछ सैंपल उपयोग जोड़ा है। Microsoft.AspNet.Identity.EntityFrameworkUI के लिए अपने डोमेन और अन्य पर इंस्टॉल करें ।
सैम फराजपुर घमरी

2
1) अपने बारे में चिंता मत करो web.config। पुराने को प्रतिस्थापित न करें। अधिक जानकारी के लिए इसे पढ़ें । मुझे लगता है कि आपके एमवीसी ने भी अपग्रेड किया है।
सैम फराजपुर घमरी

1
2) आपने सही किया। 3) कोई समस्या नहीं। आपके पास 5 नए टेबल होंगे AspNetRoles AspNetUserClaims AspNetUserLogins AspNetUserRolesऔरAspNetUsers
सैम फराजपुर गामरी

3
मैं सिर्फ क्लिंट ईस्टवुड, नाइस जॉब की मदद से आपके द्वारा छोड़ी गई सभी टिप्पणियों को पढ़ता हूं !! दुनिया को You plusOne
Chef_Code

24

यह वही है जो मैंने एक मौजूदा डेटाबेस के साथ पहचान को एकीकृत करने के लिए किया था।

  1. MVC टेम्पलेट के साथ एक नमूना MVC प्रोजेक्ट बनाएँ। यह पहचान कार्यान्वयन के लिए आवश्यक सभी कोड है - Startup.Auth.cs, IdentityConfig.cs, खाता नियंत्रक कोड, नियंत्रक, मॉडल और संबंधित विचार प्रबंधित करें।

  2. पहचान और OWIN के लिए आवश्यक नगेट पैकेज स्थापित करें। आप नमूना परियोजना में संदर्भ और @Sam द्वारा उत्तर देखकर एक विचार प्राप्त करेंगे

  3. इन सभी कोड को अपने मौजूदा प्रोजेक्ट में कॉपी करें। कृपया ध्यान दें कि पहचान के लिए "DefaultConnection" कनेक्शन स्ट्रिंग को अपने डेटाबेस में मैप करने के लिए जोड़ना न भूलें। कृपया IdentityModel.cs में ApplicationDBContext वर्ग की जाँच करें जहाँ आपको "DefaultConnection" कनेक्शन स्ट्रिंग का संदर्भ मिलेगा।

  4. यह एसक्यूएल स्क्रिप्ट है जो मैं अपने मौजूदा डेटाबेस पर आवश्यक तालिकाओं को बनाने के लिए चलाता था:

    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. किसी भी शेष त्रुटियों की जांच करें और हल करें और आप कर रहे हैं। पहचान बाकी संभाल लेंगे :)


1
आपके उत्तर और अच्छी व्याख्याओं के लिए बहुत धन्यवाद। वास्तव में मैं एक और दृष्टिकोण का उपयोग करने के बारे में सोचता हूं, लेकिन मैं इसे भी आजमाऊंगा। वोट +
जैक

2
मुझे लगता है कि यह एक बहुत क्लीनर दृष्टिकोण है
निको

3
Startup.Auth.cs वर्ग के अलावा आपको नमूना प्रोजेक्ट के रूट पर स्थित Startup.cs की प्रतिलिपि बनाने की आवश्यकता है।
पद्मिका

श्यामल क्या आप @ पद्मिका की टिप्पणी से स्टार्टअप को जोड़ सकते हैं? यह महत्वपूर्ण है।
माइक

4

मैं IdentityServer की सलाह देता हूं । यह एक .NET फाउंडेशन प्रोजेक्ट है और प्रमाणीकरण और प्राधिकरण के बारे में कई मुद्दों को शामिल करता है।

अवलोकन

IdentityServer एक .NET / कटाना-आधारित फ्रेमवर्क और होस्ट करने योग्य घटक है जो OpenID कनेक्ट और OAuth2 जैसे प्रोटोकॉल का उपयोग करके आधुनिक वेब अनुप्रयोगों और API के लिए एकल साइन-ऑन और एक्सेस नियंत्रण को लागू करने की अनुमति देता है। यह मोबाइल, वेब, एसपीए और डेस्कटॉप एप्लिकेशन जैसे ग्राहकों की एक विस्तृत श्रृंखला का समर्थन करता है और नए और मौजूदा आर्किटेक्चर में एकीकरण की अनुमति देने के लिए एक्स्टेंसिबल है।

अधिक जानकारी के लिए, उदाहरण के लिए

  • सदस्यता के लिए समर्थन रीबूट और ASP.NET पहचान आधारित उपयोगकर्ता भंडार
  • अतिरिक्त कटाना प्रमाणीकरण मिडलवेयर के लिए समर्थन (जैसे Google, ट्विटर, फेसबुक आदि)
  • EntityFramework कॉन्फ़िगरेशन के आधार पर दृढ़ता के लिए समर्थन
  • WS- फेडरेशन के लिए समर्थन
  • तानाना

बाहर की जाँच प्रलेखन और डेमो


6
आइडेंटिटीसेवर के व्यावहारिक उपयोग को आइडेंटिटी सेवर कार्यान्वयन में नेत्रहीन रूप से कूदने से पहले विचार किया जाना चाहिए।
हेंज़ोलो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.