قسمت اول اضافه کردنIdentity به پروژه MVC

3/14/2016 MVC
1641

قسمت اول از دو قسمت (قسمت دوم)

استفاده از Identity  در پروژه های MVC  به جای membership  در پروژه های asp.net  کاربرد بیشتر دارد . به صورت پیشفرض Identity  به پروژه ها ی mvc اضافه شده است اما برای گسترش آن و استفاده از Role  در آن بهتراست یک سری اضافات را در آن انجام داد.

به صورت پیشفرض و با Visual studio 2013 میتوان مستقیم دستور مربوطه را از nuget  در کنسول آن نوشت 

Install-Package Microsoft.AspNet.Identity.Samples -Pre

قسمت اول از دو قسمت (قسمت دوم)

استفاده از دستور nuget چند تغییر در پروژه ایجاد میکند 

  • کل نمای سایت را به نمای طراحی شده در مثال تغییر میدهد.
  • در رشته connectionstrsing مربوط به بانک اطلاعاتی از ورژن Local Db  استفاده میکند که در Visual studio 2015 نیاز به نصب این ورژن از SQL خواهید داشت ، البته به صورت دستی میتوانید این Connection  را تغییر دهید.

حال برای اضافه کردن دستی بدون استفاده از دستور ذکر شده لازم کارهای زیر را انجام دهیم. 

1- اضافه کردن ApplicationRoleManager در فایل در کلاس IdentityConfig از پوشه App_Start

2- اضافه کردن ApplicationDbInitializerدر فایل در کلاس IdentityConfig از پوشه App_Start جهت ثبت مدیر پیشفرض

3- تغییر نام مدیر و کلمه عبور

4- اضافه کردن RoleManger  به Startup.Auth.cs در پوشه App_Start

5 - ایجاد کلاس ViewModel و جایگزینی کدها

 #اولین  کار اضافه کردن کد زیر در کلاس IdentityConfig از پوشه App_Start است  (خط 72)

// Configure the RoleManager used in the application. RoleManager is defined in the ASP.NET Identity core assembly
    public class ApplicationRoleManager : RoleManager<IdentityRole>
    {
        public ApplicationRoleManager(IRoleStore<IdentityRole,string> roleStore)
            : base(roleStore)
        {
        }

        public static ApplicationRoleManager Create(IdentityFactoryOptions<ApplicationRoleManager> options, IOwinContext context)
        {
            return new ApplicationRoleManager(new RoleStore<IdentityRole>(context.Get<ApplicationDbContext>()));
        }
    }

# همچنین در صورتی که پروژه را تا کنون اجرا نکرده اید (در اولین اجرا دستورات ایجاد بانک اطلاعاتی ذخیره میگردد) میتوانید این کد را هم به فایل Identity Config  اضافه کنید تا در صورتیکه برای اولین بار پروژه را اجرا می کنید و یا اینکه هنوز بانک اطلاعاتی ایجاد نشده ، کاربر با دسترسی ادمین و نام کاربری و کلمه عبور به بانک اطلاعاتی اضافه شود .

// This is useful if you do not want to tear down the database each time you run the application.
    // public class ApplicationDbInitializer : DropCreateDatabaseAlways<ApplicationDbContext>
    // This example shows you how to create a new database if the Model changes
    public class ApplicationDbInitializer : DropCreateDatabaseIfModelChanges<ApplicationDbContext> 
    {
        protected override void Seed(ApplicationDbContext context) {
            InitializeIdentityForEF(context);
            base.Seed(context);
        }

        //Create User=Admin@Admin.com with password=Admin@123456 in the Admin role        
        public static void InitializeIdentityForEF(ApplicationDbContext db) {
            var userManager = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
            var roleManager = HttpContext.Current.GetOwinContext().Get<ApplicationRoleManager>();
            const string name = "admin@example.com";
            const string password = "Admin@123456";
            const string roleName = "Admin";

            //Create Role Admin if it does not exist
            var role = roleManager.FindByName(roleName);
            if (role == null) {
                role = new IdentityRole(roleName);
                var roleresult = roleManager.Create(role);
            }

            var user = userManager.FindByName(name);
            if (user == null) {
                user = new ApplicationUser { UserName = name, Email = name };
                var result = userManager.Create(user, password);
                result = userManager.SetLockoutEnabled(user.Id, false);
            }

            // Add user admin to Role Admin if not already added
            var rolesForUser = userManager.GetRoles(user.Id);
            if (!rolesForUser.Contains(role.Name)) {
                var result = userManager.AddToRole(user.Id, role.Name);
            }
        }
    }

در کد بالا توصیه میشود به جای

 const string name = "admin@example.com";
            const string password = "Admin@123456";
            const string roleName = "Admin";

نام کاربری مدیر و کلمه عبور را تغییر دهید

اضافه کردن کد 

 static ApplicationDbContext()
        {
            // Set the database intializer which is run once during application start
            // This seeds the database with admin user credentials and admin role
            Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());
        }

به ApplicationDbContext تا در زمانی که تغییری د ربانک اطلاعاتی ایجاد میگردد قطعه کد مربوط به ایجاد مدیر پیشفرض نیز اجرا شود و در مجموع کد مربوط به ApplicationDbContext به صورت زیر خواهد بود 

 public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
    {
        public ApplicationDbContext()
            : base("DefaultConnection", throwIfV1Schema: false)
        {
        }
        static ApplicationDbContext()
        {
            // Set the database intializer which is run once during application start
            // This seeds the database with admin user credentials and admin role
            Database.SetInitializer<ApplicationDbContext>(new ApplicationDbInitializer());
        }

        public static ApplicationDbContext Create()
        {
            return new ApplicationDbContext();
        }
    }



# اضافه کردن 

app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);

به کلاس Startup.Auth.cs در پوشه App_Start که در نهایت این کلاس به شکل زیر تغییر میکند

 app.CreatePerOwinContext(ApplicationDbContext.Create);
            app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
            app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);
            app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create

اضافه کردن کلاس AdminViewModel  به پوشه Model در پروژه ، و حذف کلاسی که پروژه به همین نام میسازد  و جایگزین کردن کد های زیر در میان قسمت namespace

public class RoleViewModel
    {
        public string Id { get; set; }
        [Required(AllowEmptyStrings = false)]
        [Display(Name = "RoleName")]
        public string Name { get; set; }
    }

    public class EditUserViewModel
    {
        public string Id { get; set; }

        [Required(AllowEmptyStrings = false)]
        [Display(Name = "Email")]
        [EmailAddress]
        public string Email { get; set; }

        public IEnumerable<SelectListItem> RolesList { get; set; }
    }

حال نوبت به ساخت controller برای مدیریت user و مدیریت role  است در قسمت دوم به آن میپردازیم

پایان قسمت اول