PDA

View Full Version : Simple member ship، Custom Member ship، Identity 2.0 کدام یک؟؟؟



hadi0x7c7
جمعه 17 مرداد 1393, 11:07 صبح
سلام
آقا ما آخرش موندیم که برای احراز حویت و سطح دسترسی برای برنامه های MVC باید چی کار کرد؟ منظورم از برنامه هایی هست که نیاز اون بیش از ثبت نام کاربری و ایمیل و چیز های ساده هستش، مثلا یه سایت که کاربر، باید لیست خریداش، کامنتاش، لایک هایی که انجام داده، علاقه مندی هاش و هزار تا فیلد اضافی دیگه! رو توی پایگاه داده نگه داری.

اول از همه ممنون میشم که بگن که اینجا (http://www.dotnettips.info/post/822/asp-net-mvc-18#comment-3995)از کدام متد استفاده میکنه؟ (میدونم Forms هستا!!) منظورم از simple member ship , ....
بعد سیستم احراز هویت IRIS که در اینجاس (https://irismemebership.codeplex.com/)از کدوم روشه.

با Identity کار کردم و میدونم که به راحتی میشه فیلدای اضافی به کلاس User اضافه کرد ولی یه مشکلی که داره همه کارا رو باید از طریق UserManger انجام بدی که یکم کار با ساختار Unit Of work که اینجا (http://www.dotnettips.info/post/842/ef-code-first-12)معرفی شده رو سخت میکنه ! یا شایدم من بلد نیستم(ولی خداییش به نظرم به درد ما نمیخوره!)

دوستان ممنون میشم یه راهنمایی کنید که مثلا برای نوشتن یه سایت فروشگاه، که کاربر لیستی از کامنتا، لایک ها، خرید ها، و ... رو باید واسش نگه داریم، چطوری باید این اطلاعات رو یه جوری با یکی از این سیستم های احراز هویت که در عنوان هست ادغام کنیم!

hakim22
شنبه 18 مرداد 1393, 08:43 صبح
مسلما بهترینش Identity 2.0 است و با اختلاف زیاد نسبت به روشهای قبل بهینه سازی شده . اضافه کردن فیلد جدید به این جدول خیلی هم ساده است . در فایل IdentityModel که همراه Individual User ساخته میشود کدهای زیر را قرار دهید :


public class MyUser : IdentityUser
{
public string Country { get; set; }
}
public class ApplicationUser : MyUser
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
}

public string CityName { get; set; }

}


اگر به تعریف کلاس ApplicationDbContext نگاه کنید :


public class ApplicationDbContext : IdentityDbContext<ApplicationUser>


می بینید که این کلاس به کلاس ApplicationUser به صورت Generic وابسته است . حالا شما به هر روشی که فیلدر به کلاس ApplicationUser اضافه کنید خود به خود در جدول مربوط به کاربران اضافه میشود . در کد اول من فیلد CityName را مستقیما به این کلاس اضافه کردم و فیلد Country رو به کلاس MyUser اضافه کردم که بعدا کلاس ApplicationUser از آن ارث بری میکند. بعد از بازسازی جداول خواهید دید که هر دو فیلد به بانک اطلاعاتی اضافه میشوند.

پیاده سازی IUserManager زمانی لازم میشه که شما بخواهید مسئله ی لایه ها و جداسازی وابستگی را به صورت کاملا اصولی پیاده کنید. مخصوصا وقتی که لایه های شما در چند ClassLibrary جدا قرار داشته باشند. هر پروژه ای که بخواد از کاربرها استفاده کنه هم باید به Identity و هم باید به EntityFrameWork رفرنس داشته باشه که برای بعضی ها چندان مطلوب نیست. این یک اشکال خیلی ریز هسا و خیلی ها از کنارش میگذرند و تاثیری هم در نهایت پروژه ندارد. فقط اگر وسواس ساختاری دارید برای شما مهم میشود. و آن دوستانی که از این سطح به پروژه نگاه میکنند دردسر پیاده سازی IUserManager و سایر اینترفیس های مربوطه را هم به جان میخرند.

بعد برای ارتباط برقرار کردن بین سایر جداول و جدول کاربران مانند همیشه عمل میکنید.


public string UserId { get; set; }
public virtual ApplicationUser User { get; set; }


همانطور که می بینید نقاط زیادی هست که شما می توانید روش های پیشفرض کاری Identity 2.0 را تغییر دهید. شما می توانید از همه کلاسهای مربوطه ارث بری کنید و یک متد خاص را Override کنید. در این روش شما مستقیما به DbContext دسترسی ندارید. فقط زمانی که اینترفیس ها را خودتان پیاده سازی کنید وابستگی سیستم مدیریت کاربران به EntityFramework را قطع کنید.

hp1361
شنبه 19 مهر 1393, 10:35 صبح
سلام

از دوستان کسی پیاده سازی Identity2.0 و IUnitOfWork در کنار هم رو انجام داده؟

اگر ممکنه نتیجه تجربیات رو با ما به اشتراک بگذارید که بدونیم چطور میشه اونو پیاده سازی کرد

ممنون