ورود

View Full Version : سوال: کار با Identity در mvc



m.amin1964
یک شنبه 25 بهمن 1394, 18:28 عصر
با سلام خدمت بزرگواران
چند وقته درگیر احراز هویت از طریق Identity هستم ، جستجو های بسیاری انجام دادم و هنوز دقیقا نمیدونم که وقتی یه پروژه خالی (Empty) ایجاد میکنم چه بسته هایی از nuget رو نصب کنم ؟!
آیا فقط بسته ی Microsoft.AspNet.Identity.EntityFramework کافیه برای احراز هویت کاربران ؟

hakim22
دوشنبه 26 بهمن 1394, 04:06 صبح
به طور کلی Identity یک Middle-ware است و با OWIN کار میکند. اول باید با نحوه ی کار این دو آشنایی داشته باشید.
برای مشاهده ی کدهای نمونه و تنظیم و راه اندازی آن یک پروژه ی پیش فرض با استفاده از تمپلت ویژوال استودیو بسازید و مراحل را دنبال کنید.

پیشنهاد میکنم از فایلهای ساخته شده ی پیشفرض استفاده کنید.
و آنها را ویرایش کنید تا به خواسته ی خود برسید و نه برعکس.
با Identity کار کردن از کل به جزء کار کردن راحت تر است تا از شروع از صفر (طراحی از جز به کل)

oracle_dba
دوشنبه 26 بهمن 1394, 12:29 عصر
سلام من چند سئوال داشتم تو این زمینه
من یه پروژه با استفاده از تمپلیت های Identity ساختم و تونستم کاربر و نقش ثبت کنم و اجازه دسترسی به نقش های خاصی رو برای یک اکشن بدم یا ندم ولی هنوز خیلی جاهاش ابهام دارم .
1-برای مدیریت کاربران و نقش ها بهتر اینه که از Identity استفاده کنیم یا خودمون سیاست هارو اجرا کنیم و پیاده سازی کنیم و همیشه از اون کلاس ها استفاده کنیم
2- الان پروژه های بزرگ با بخش مدیریت کاربران مثل همین سایت از Identity استفاده می کنند .
3-من برای مجوز ها و اضافه کردن مجوز به نقش مشکل داشتم و نتونستم این کار رو انجام بدم . اگه کسی می تونه یه توضیحی بده در این مورد ممنون میشم .
4-تو مثالی که من انجام دادم به یک اکشن برای یه نقش اجازه داده میشد و یا داده نمیشد ول یاگه بخواهیم در یک اکشن کاربر فقط بتونه رکورد های خودش رو ببینه چیکار باید کرد ؟

oracle_dba
دوشنبه 26 بهمن 1394, 12:30 عصر
فارسی کرن و customize کردن کلاس های خود identity امکان پذیر است . آموزش کامل در این زمینه معرفی کنید

bomb23
سه شنبه 27 بهمن 1394, 07:32 صبح
این مقاله رو مطالعه کنید :
آموزش احراز هویت user identity بخش اول (http://parsrad.com/Contents/1141/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A7%D8%AD%D8%B1%D8%A7%D8%B2-%D9%87%D9%88%DB%8C%D8%AA-user-identity-%D8%A8%D8%AE%D8%B4-%D8%A7%D9%88%D9%84)

آموزش احراز هویت user identity بخش دوم (http://parsrad.com/Contents/1142/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A7%D8%AD%D8%B1%D8%A7%D8%B2-%D9%87%D9%88%DB%8C%D8%AA-user-identity-%D8%A8%D8%AE%D8%B4-%D8%AF%D9%88%D9%85)
(http://parsrad.com/Contents/1141/%D8%A2%D9%85%D9%88%D8%B2%D8%B4-%D8%A7%D8%AD%D8%B1%D8%A7%D8%B2-%D9%87%D9%88%DB%8C%D8%AA-user-identity-%D8%A8%D8%AE%D8%B4-%D8%A7%D9%88%D9%84)

oracle_dba
جمعه 30 بهمن 1394, 05:08 صبح
سلام . من واقعا گیج شدم . نمیدونم چیکار باید بکنم . از identity استفاده کردم . تا حدودی کار کردم و جواب داد . مثلا لاگین و فرم عضویت و نقش ها و ...
ولی خیلی مبهمه . نمیدونم چطور میشه تغییر توش ایجار کرد . مثلا چطور میشه پراپرتی جدید برای کاربر تعریف کرد . مثلا تلفن
ویو مدل ها رو که تعریف کرده خیلی مبهمه . یعنی مثلا منم باید بیام برای نقش ها ویو مدل تعریف کنم ؟؟ تعریف کردم ولی چطور ویو رو از اون ویو مدل بسازم ؟؟ خطا میده

تو نقش ها هم هیچ جایی نمیبینم که بشه اتریبیوت برای پراپرتی ها ی نقش تعریف کرد .
به نظرم اگه از صفر خودم سیاست های مدیریت کاربران رو طراحی و پیاده سازی کنم بهتره و مدیریتش راحت تره .
سه روزه دارم فقط تست می کنم و پاک می کنم و از ابتدا . . . . . رفرنس های مختلف رو هم خوندم چیز زیادی نفهمیدم . . . شایدم چون تازه ام وی سی رو شروع کردم اینطوریه
:ناراحت::ناراحت::ناراحت::نار حت::ناراحت:
کمک کنید . . .

bomb23
شنبه 01 اسفند 1394, 02:55 صبح
سلام . من واقعا گیج شدم . نمیدونم چیکار باید بکنم . از identity استفاده کردم . تا حدودی کار کردم و جواب داد . مثلا لاگین و فرم عضویت و نقش ها و ...
ولی خیلی مبهمه . نمیدونم چطور میشه تغییر توش ایجار کرد . مثلا چطور میشه پراپرتی جدید برای کاربر تعریف کرد . مثلا تلفن
ویو مدل ها رو که تعریف کرده خیلی مبهمه . یعنی مثلا منم باید بیام برای نقش ها ویو مدل تعریف کنم ؟؟ تعریف کردم ولی چطور ویو رو از اون ویو مدل بسازم ؟؟ خطا میده

تو نقش ها هم هیچ جایی نمیبینم که بشه اتریبیوت برای پراپرتی ها ی نقش تعریف کرد .
به نظرم اگه از صفر خودم سیاست های مدیریت کاربران رو طراحی و پیاده سازی کنم بهتره و مدیریتش راحت تره .
سه روزه دارم فقط تست می کنم و پاک می کنم و از ابتدا . . . . . رفرنس های مختلف رو هم خوندم چیز زیادی نفهمیدم . . . شایدم چون تازه ام وی سی رو شروع کردم اینطوریه
:ناراحت::ناراحت::ناراحت::نار حت::ناراحت:
کمک کنید . . .

دو تا مقاله اشاره شده در پیام قبلی رو مطالعه کنید برای شروع به کار خیلی مفیده و کاملا گویاست.

r4hgozar
شنبه 01 اسفند 1394, 05:45 صبح
سلام.
من توصیه می کنم identityt-sample رو به پروژه اضافه کنید. خیلی از کد ها آماده شده و می تونید از اونها استفاده کنید.
اما اگه قبلا پروژه دارید این کار رو نکنید چون خیلی از کد ها رو عوض می کنه.

اما می تونید یه پروژه جدید بسازید و identity sample رو نصب کنید و بعد custome کنید و از اون استفاده کنید.
وبعد کد ها و کلاس ها رو اضافه کنید به پروژه هاتون.
همین کاری که من خودم انجام دادم.
من هم یه identity sample رو نشستم کاملا درستش کردم و هر وقت نیاز داشته باشم از جاهای مختلفش در پروژه های از اون استفاده می کنم.
موفق باشی

oracle_dba
دوشنبه 03 اسفند 1394, 14:39 عصر
سلام و ممنون . من هر دو فایل راهنما رو دیدم و طبق مثالی زده بود رفتم جلو ولی برخی متد های استفاده شده رو خطا میداد . نمی دونم این مثال تست شده است . ..
همچین من وقتی نفهمم چیکار دارم می کنم و هر کدوم از اون کد ها چیکار می کنند حس خوبی ندارم .
دو راه دارم . . .
1- خودم بیام و سیاست مدیریت کاربران رو پیاده کنم
2- از identity استفاده کنم و برای سایر مشخصات کاربرانم جدولی به نام پروفایل بذارم که از user id به عنوان کلید خارجی توش استفاده کنم . تا یواش یواش با این تکنولوژی آشنا بشم .
به نظر شما کدوم راه حل بهینه تره . یه دوره فشرده هم تو عید برگزار میشه به گفته خودشون فروشگاه اینترنتی حرفه ای ولی پرسیدم میگه ما از identity استفاده نمی کنیم . . . چرا ؟؟؟؟؟؟؟؟؟
آیا برنامه نویسان خیلی سمت این تکنولوژی نمیرن و همه خودشون سیاست مدیریت کاربران و امنیت رو پیاده سازی می کنند ؟؟؟

فقط یه مشکل دارم که ممنون میشم راهنمایی کنید :
الان من ارتباط چند به چند دارم بین کلاس کاربر و کلاس نقش (code first) و خودش این جدول واسط رو می سازه که حاوی فیلد کلید هر دو جدول کاربر و نقش است .
حالا اگه بخوام اطلاعاتی رو از اون جدول بخونم یا در اون جدول تغییری بدم این جدول واسط توی DataBaseContext که تعریف نشده پس چجوری میشه بهش دسترسی داشت ؟؟؟؟

anylove
سه شنبه 04 اسفند 1394, 17:37 عصر
اگه ممکنه امنیت توسط identity رو با یک مثال ساده توضیح بدیید
ساده ترین نوعش رو توضیح بدید

hakim22
چهارشنبه 05 اسفند 1394, 00:59 صبح
سلام و ممنون . من هر دو فایل راهنما رو دیدم و طبق مثالی زده بود رفتم جلو ولی برخی متد های استفاده شده رو خطا میداد . نمی دونم این مثال تست شده است . ..
همچین من وقتی نفهمم چیکار دارم می کنم و هر کدوم از اون کد ها چیکار می کنند حس خوبی ندارم .
دو راه دارم . . .
1- خودم بیام و سیاست مدیریت کاربران رو پیاده کنم
2- از identity استفاده کنم و برای سایر مشخصات کاربرانم جدولی به نام پروفایل بذارم که از user id به عنوان کلید خارجی توش استفاده کنم . تا یواش یواش با این تکنولوژی آشنا بشم .
به نظر شما کدوم راه حل بهینه تره . یه دوره فشرده هم تو عید برگزار میشه به گفته خودشون فروشگاه اینترنتی حرفه ای ولی پرسیدم میگه ما از identity استفاده نمی کنیم . . . چرا ؟؟؟؟؟؟؟؟؟
آیا برنامه نویسان خیلی سمت این تکنولوژی نمیرن و همه خودشون سیاست مدیریت کاربران و امنیت رو پیاده سازی می کنند ؟؟؟

فقط یه مشکل دارم که ممنون میشم راهنمایی کنید :
الان من ارتباط چند به چند دارم بین کلاس کاربر و کلاس نقش (code first) و خودش این جدول واسط رو می سازه که حاوی فیلد کلید هر دو جدول کاربر و نقش است .
حالا اگه بخوام اطلاعاتی رو از اون جدول بخونم یا در اون جدول تغییری بدم این جدول واسط توی DataBaseContext که تعریف نشده پس چجوری میشه بهش دسترسی داشت ؟؟؟؟

شما باید کار با Identity رو بیاموزید. برای پیاده سازی سیستم مدیریت کاربرها حتما از Identity استفاده کنید. خیلی از امکانات امنیتی در ASP بر مبنای Identity است. حتی بسیاری از شرکتها و برنامه نویسان حرفه ای که مستقیما از Identity استفاده نمی کنند از اینترفیس ها و کلاسهای پایه ی آن برای پیاده سازی سیستم امنیت سایت استفاده میکنند.

بدون Identity پیاده سازی ثبت نام با گوگل ، Facebook و GitHub و ... خیلی پیچیده میشود در حالی که با Identity در چند دقیقه به سایت اضافه میشود.

شرط کار با این ابزار آشنایی با Code First است. متاسفانه خیلی از کسانی که سعی میکنند Identity را یاد بگیرند فراموش میکنند که کدها بر مبنای Code first کار میکند.

hakim22
چهارشنبه 05 اسفند 1394, 01:14 صبح
ابزار Identity برای مدیریت کاربرها از IdentityDbContext استفاده میکند. این کلاس از کلاس DbContext ارث بری کرده.

برای ساختن Relation ساده ترین راه این است که جداولی که با کاربرها رابطه دارند درون IdentityDbContext تعریف کنید (DbSet را اینجا قرار دهید)

کلاس ApplicationUser برای اضافه کردن فیلدهای مربوط به پروفایل مورد استفاده قرار میگیرد.
این کلاس از IdentityUser ارث بری میکند. تمام خصوصیات کاربر مربوط به Identity در IdentityUser تعریف شده است.
وقتی می خواهید یک فیلد جدید به جدول کاربران اضافه کنید فیلد را درون این کلاس اضافه کنید :


public class ApplicationUser : IdentityUser
{



[MaxLength(32)]
public string FirstName { get; set; }


[MaxLength(32)]
public string LastName { get; set; }


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


در مثال بالا فیلدهای نام و نام خانوادگی به جدول کاربران اضافه شده است.

شما میتوانید تمام جداول دیتابیس را درون IdentityDbContext تعریف کنید. (حتی آنهایی که مربوط به Identity نمی شوند و رابطه ای هم با آن ندارند.) برای پروژه های کوچک (و در شروع کار) این بهترین راه است.

راه بهتر استفاده از چند DbContext است. که مدیریت دیتابیس ها را پیچیده تر میکند. و نیازی به آن ندارید.

به طور کلی وقت خودتون رو صرف پیاده کردن Relation نکنید . دیتابیس ها بدون Relation هم کار میکنند. مخصوصا اینکه خیلی از جداول پروژه به جدول کاربرها ارتباط دارد. کم کم متوجه میشوید که یک جدول کاربر دارید و 20 ارتباط که مدیریت کردن آنها خیلی سخت میشود. در پروژه های کوچک نیازی به اینهمه دقت در جزئیات نیست. هر وقت لازم باشد در آینده میتوانید این ارتباط ها را اضافه کنید.

معمولا پروژه ها آنقدر بزرگ نمی شوند که رابطه تاثیری در بازدهی و سرعت داشته باشد. شما میتوانید دیتابیس های بسیار بزرگی بسازید بدون اینکه از Relation استفاده کنید. اتفاقا در پروژه های بزرگ که جداول بسیار زیادی دارند از این روش اصلا استفاده نمیشود. چرا که تغییر دادن دیتابیس را بسیار مشکل میکند و برای بروز رسانی مداوم یک چالش جدی است.

فقط وقتی از ارتباط استفاده کنید که الزامی و حیاطی است.

oracle_dba
چهارشنبه 05 اسفند 1394, 11:29 صبح
ممنون از پاسختون و حوصله ای که میذارید برای راهنمایی دیگران
یعنی شما میگید هیچ ارتباطی رو تعریف نکنیم . مثلا در ارتباط یک به چند کلید های خارجی رو دستی مقدار دهی کنیم ؟؟؟

hakim22
پنج شنبه 06 اسفند 1394, 05:36 صبح
ممنون از پاسختون و حوصله ای که میذارید برای راهنمایی دیگران
یعنی شما میگید هیچ ارتباطی رو تعریف نکنیم . مثلا در ارتباط یک به چند کلید های خارجی رو دستی مقدار دهی کنیم ؟؟؟

من نمیگم هیچ ارتباطی تعریف نکنید . فقط میگم ایجاد Relation در پیاده سازی دیتابیس الزامی نیست.
دلیلی وجود نداره که چون به صورت منطقی بین دو مدل یک رابطه وجود داره حتما باید در دیتابیس این رابطه نمود پیدا کنه.

بعضی مواقع (در رابطه ی چند به چند) بهتر است تعریف کنید تا از Code first به درستی استفاده کنید.
ولی در انجام اینکار وسواس نداشته باشید و خودتون رو به خاطر ایجاد نکردن یک رابطه بین دو جدول سرزنش نکنید.
اگر خیلی سخت شد ، شلوغ شد یا پیچیده شد ازش صرف نظر کنید.

نکته ی آخر اینکه اگر شما برنامه نویس وب هستید نباید به دیتابیس به صورت تخصصی نگاه کنید و سعی کنید
همه چیز دیتابیس در بهترین شرایط باشه چون نمی توانید .
طراحی و مدیریت دیتابیس یک کار تخصصی است. تا یک جایی به شما مربوط میشود و از یک جایی به بعد دیگر خیر.