একটি বিদ্যমান প্রকল্পে ASP.NET MVC5 পরিচয় প্রমাণীকরণ যুক্ত করা হচ্ছে


164

আমি ওয়েবে প্রচুর অনুরূপ পৃষ্ঠাগুলি দেখেছি, তবে তাদের বেশিরভাগই একটি বিদ্যমান প্রকল্পের পরিবর্তে একটি নতুন প্রকল্প ব্যবহার করেন, বা প্রয়োজনীয় বৈশিষ্ট্যগুলি নেই। সুতরাং, আমার একটি বিদ্যমান MVC 5প্রকল্প আছে এবং লগ ইন, ইমেল নিশ্চিতকরণ এবং পাসওয়ার্ড পুনরায় সেট করার বৈশিষ্ট্যগুলির সাথে এএসপি.নেট এমভিসি 5 পরিচয় একীকরণ করতে চাই ।

এগুলি ছাড়াও, আমাকে ডাটাবেসগুলিতে যেমন ব্যবহারকারী, ভূমিকা, গোষ্ঠী ইত্যাদি প্রয়োজনীয় সমস্ত সারণী তৈরি করতে হবে (আমি আমার প্রকল্পের EF কোড প্রথম ব্যবহার করি)। এমন কোন নিবন্ধ বা নমুনা রয়েছে যা এই প্রয়োজনগুলির সাথে মিলে যায়? যেকোন পরামর্শ সম্মানের সহিত গৃহীত হবে। আগাম ধন্যবাদ...


কি দুর্দান্ত কোয়েস্টন এবং ঠিক নীচে একটি সাধারণ সলুটিন। আমি এটি পড়তে পছন্দ করতাম এবং আমার বিদ্যমান প্রকল্পেও সংহত করার জন্য খারাপভাবে প্রয়োজন।
worশ্বর খানাল

উত্তর:


282

আপনার বিদ্যমান প্রকল্পে পরিচয় কনফিগার করা কঠিন জিনিস নয়। আপনাকে অবশ্যই কিছু নুগেট প্যাকেজ ইনস্টল করতে হবে এবং কিছু ছোট কনফিগারেশন করতে হবে।

প্যাকেজ ম্যানেজার কনসোল দিয়ে প্রথমে এই নিউগেট প্যাকেজগুলি ইনস্টল করুন:

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পিতামাতাকে পরিবর্তন করুন :DbContextIdentityDbContext<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>
}

আপনি যদি একই সংযোগের স্ট্রিং এবং সক্ষম মাইগ্রেশন ব্যবহার করেন তবে EF আপনার জন্য প্রয়োজনীয় সারণী তৈরি করবে।

Allyচ্ছিকভাবে, আপনি 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ফোল্ডারে (অথবা আপনি চাইলে অন্য কোথাও) একটি শ্রেণি যুক্ত করুন । এই ক্লাসটি ওউআইএন ব্যবহার করে। এটি আপনার স্টার্টআপ ক্লাস হবে।

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>

এখন পুরো প্রকল্পে আপনি পরিচয় ব্যবহার করতে পারবেন ঠিক তেমন কোনও নতুন প্রকল্প ইতিমধ্যে ভিএস দ্বারা ইনস্টল করা হয়েছিল উদাহরণস্বরূপ লগইন ক্রিয়া বিবেচনা করুন

[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ব্যবহারকারীর শ্রেণিবদ্ধ করতে ব্যবহার করেছি এবং পরিচয়ের ভূমিকা পরিচালক। এবং যেহেতু Roleএবং RoleManagerইতিমধ্যে পরিচয় নিজেই প্রয়োগ করেছেন আপনার ইতিমধ্যে প্রয়োগকৃত কোড পুনরায় লেখার দরকার নেই। আপনি কীভাবে ভূমিকা ব্যবহার করতে পারেন তা দেখানোর জন্য পোস্টটি আপডেট করব। এবং যেমনটি আমি আগে বলেছিলাম আপনার পরিচয় আরম্ভ করার জন্য আপনাকে কেবল যুক্ত AppUserএবং AppRoleসত্ত্বাগুলি প্রয়োজন । সমস্ত প্রয়োজনীয় টেবিল DbContextথেকে উত্তরাধিকারসূত্রে আপনার IdentityDbContext<AppUser>টেবিল যুক্ত করুন। আপনার কিছু করার দরকার নেই কেবল মাইগ্রেশন সক্ষম করুন।
স্যাম ফরাজপুর গৌমারি

2
আমি সবেমাত্র কিছু নমুনা ব্যবহার যুক্ত করেছি। Microsoft.AspNet.Identity.EntityFrameworkআপনার ডোমেন এবং অন্যান্য ইউআইয়ের জন্য ইনস্টল করুন ।
স্যাম ফরাজপুর ঘামারী

2
1) আপনার সম্পর্কে চিন্তা করবেন না web.config। পুরানো প্রতিস্থাপন করবেন না। আরও তথ্যের জন্য এটি পড়ুন । আমি মনে করি আপনার এমভিসিও আপগ্রেড হয়েছে।
স্যাম ফরাজপুর গৌমারী

1
2) আপনি ঠিক করেছেন। 3) কোন সমস্যা নেই। আপনার কাছে 5 টি নতুন টেবিল AspNetRoles AspNetUserClaims AspNetUserLogins AspNetUserRolesএবংAspNetUsers
স্যাম ফরাজপুর গৌমারি

3
আপনি ক্লিন্ট ইস্টউড, নিস জবকে সাহায্য করার জন্য রেখে গেছেন এমন সমস্ত মন্তব্য আমি কেবল পড়েছি! বিশ্বে আপনার প্লাস ওনের মতো আরও লোকের প্রয়োজন
শেফ_কোড

24

বিদ্যমান ডাটাবেসের সাথে পরিচয় একীকরণ করতে আমি এটিই করেছি।

  1. এমভিসি টেমপ্লেট সহ একটি নমুনা এমভিসি প্রকল্প তৈরি করুন। আইডেন্টিটি বাস্তবায়নের জন্য এটিতে প্রয়োজনীয় সমস্ত কোড রয়েছে - স্টার্টআপ.আথ সিটি, আইডেন্টিটি কনফিগ.সি, অ্যাকাউন্ট কন্ট্রোলার কোড, পরিচালনা কন্ট্রোলার, মডেলস এবং সম্পর্কিত দর্শনগুলি।

  2. পরিচয় এবং OWIN এর জন্য প্রয়োজনীয় নুগেট প্যাকেজ ইনস্টল করুন। নমুনা প্রকল্পের রেফারেন্সগুলি এবং @ স্যাম এর উত্তর দেখে আপনি একটি ধারণা পাবেন

  3. আপনার বিদ্যমান প্রকল্পে এই সমস্ত কোড অনুলিপি করুন। দয়া করে নোট করুন আপনার ডেটাবেজে মানচিত্রের পরিচয়ের জন্য "ডিফল্ট সংযোগ" সংযোগ স্ট্রিং যুক্ত করতে ভুলবেন না। আপনি "ডিফল্ট সংযোগ" সংযোগের স্ট্রিংয়ের রেফারেন্সটি পাবেন এমন আইডেন্টিটিমডেল.কমগুলিতে অ্যাপ্লিকেশনডিসিবিসেক্সটেক্স ক্লাসটি পরীক্ষা করুন।

  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
স্টার্টআপ.আউথ.সি. ক্লাস ছাড়াও আপনাকে নমুনা প্রকল্পের মূলটিতে থাকা স্টার্টআপ.কগুলি অনুলিপি করতে হবে।
পদ্মিকা

শ্যামল আপনি কি পদ্মিকার মন্তব্য থেকে শুরু করতে পারেন? এটা গুরুত্বপূর্ণ.
মাইকে

4

আমি আইডেন্টিটি সার্ভারের প্রস্তাব দিই । এটি একটি। নেট ফাউন্ডেশন প্রকল্প এবং প্রমাণীকরণ এবং অনুমোদনের বিষয়ে অনেকগুলি বিষয় কভার করে।

সংক্ষিপ্ত বিবরণ

আইডেন্টিটি সার্ভার হ'ল নেট / ক্যাটানা ভিত্তিক কাঠামো এবং হোস্টেবল উপাদান যা ওপেনআইডি কানেক্ট এবং ওআউথ 2 এর মতো প্রোটোকল ব্যবহার করে আধুনিক ওয়েব অ্যাপ্লিকেশন এবং এপিআইয়ের জন্য একক সাইন অন এবং অ্যাক্সেস নিয়ন্ত্রণ প্রয়োগ করতে দেয়। এটি মোবাইল, ওয়েব, এসপিএ এবং ডেস্কটপ অ্যাপ্লিকেশনগুলির মতো বিস্তৃত ক্লায়েন্টকে সমর্থন করে এবং নতুন এবং বিদ্যমান আর্কিটেকচারে একীকরণের অনুমতি দেওয়ার জন্য এটি এক্সটেনসিবল।

আরও তথ্যের জন্য, যেমন

  • সদস্যতা রিবুট এবং এএসপি.এনইটি পরিচয় ভিত্তিক ব্যবহারকারী স্টোরগুলির জন্য সমর্থন
  • অতিরিক্ত কাতানা প্রমাণীকরণ মিডলওয়্যার (যেমন গুগল, টুইটার, ফেসবুক ইত্যাদি) এর জন্য সমর্থন
  • কনফিগারেশন ভিত্তিক অধ্যবসায়ের জন্য সমর্থন
  • ডাব্লুএস ফেডারেশন জন্য সমর্থন
  • extensibility

ডকুমেন্টেশন এবং ডেমো পরীক্ষা করে দেখুন ।


6
আইডেন্টিটি সার্ভার বাস্তবায়নে অন্ধভাবে লাফিয়ে ওঠার আগে আইডেন্টিটি সার্ভারের ব্যবহারিক ব্যবহারগুলি বিবেচনা করা উচিত।
হাঞ্জোলো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.