PDA

View Full Version : بهترین روش اهراز هویت از کاربران در سایت های بزرگ



mmnoody2006
دوشنبه 11 مرداد 1389, 20:58 عصر
سلام
راستش در حال نوشتن یه سایت با حجم کاربر بسیار زیاد در حد 100 هزار بازدید
هستم ولی نمی دونم از کدوم روش استفاده کنم آیا session می تونه جواب
این همه کاربر رو بده ؟

man of rebellious being
دوشنبه 11 مرداد 1389, 21:07 عصر
سلام

در مورد توانایی این روش شکی نیست ولی من شنیدم تا میشه باید از کاربرد session خودداری کرد در هر حال من فکر کنم در مورد مثال شما session بهترین item است ولی مشتاقم نظر دوستان رو بدونم

Vahid_moghaddam
دوشنبه 11 مرداد 1389, 21:39 عصر
مشکل membership خود دات نت چیه؟ جایی نوشته از authenticarion برای سایت های پر بازدید استفاده نکنید؟

Mostafa_Dindar
دوشنبه 11 مرداد 1389, 21:45 عصر
من نمیدونم کدام فرد بیخردی روش Session رو بین برنامه نویسان شایع کرده .

دوستان !!!! Membership یک نیاز فراگیر برای همه سایتهاست . مایکروسافت این نیاز رو تشخیص داده و برای این کار Solution ای تدارک دیده که همراه با ASP.NET 2.0 ارائه شده .

موفق باشید

mmnoody2006
دوشنبه 11 مرداد 1389, 21:46 عصر
من با membership مشکلی ندارم فقط دنبال بهترین روش هستم !
به نظر شما این روش حجم زیادی رو اشغال نمی کنه ؟
من که زیاد نتونستم چیزهایی رو که می خوام بهش اضافه کنم . آیا روش وجود داره تا
امکاناتی رو که نمی خوام ازش حذف کنم ؟

mmnoody2006
دوشنبه 11 مرداد 1389, 21:51 عصر
خودمم همیشه به روش های استاندارد اطمینان دارم ! ولی مشکلات این روش چیه ؟

man of rebellious being
دوشنبه 11 مرداد 1389, 22:27 عصر
من تا حالا با session کار کردم چون احساس میکنم مدیریت بیشتری رو سایتم

ضمنا اقای dindar فکر نمی کنید کمی بی رحما نه به session دارید حمله می کنید؟

imanasp
سه شنبه 12 مرداد 1389, 08:33 صبح
این که عده ای طرفدار متعصب استفاده از Session در پروژه هاشون هستند منو یاد net 1.1. میندازن و همین طور سطح سوادشون رو میرسونه بارها گفته شده که استفاده از Session هم از نظر امنیت هم از نظر بار اضافی روی سرور (بازای هر User که وارد سایت میشه یک فضایی در نظر گرفته میشه حالا شما حساب کار خودت رو بکن) و هم حدف Session در بعضی از هاستها، برای طراحی سایت به صلاح برنامه نویس نیست

sarah1361
سه شنبه 12 مرداد 1389, 08:46 صبح
چرا از سیستم اهراز هویت خود دات نت FormsAuthentication استفاده نمی کنی

یک کلاس کامل با کلی امکانات


تو همین سایت کلی آموزش در موردش هست

Ali_M.Eghbaldar
سه شنبه 12 مرداد 1389, 09:04 صبح
سلام
تفاوت استفاده از Membership و Session برای احراز هویت خیلی زیاده و اصلا اصلا قابل مقایسه نیست کاری به تعصب و اعتقاد سر روش خاضی ندارم آدم که با خودش نمی خواد لج کنه دوستان :متعجب::لبخند:
امکانات Membership
قدرت
سرعت
امنیت
انعطاف پذیری
Overhead کمتر
و هزاران نکته دیگر در مقابل Session
حالا شما بگید :چشمک:
موفق باشید

maxpayn2
سه شنبه 12 مرداد 1389, 11:16 صبح
تا اونجایی که من میدونم (اگه اشتباهه راهنمایی کنید) Membership خود دات نت خوبه تا زمانی که Role Management پیچیده نداشته باشی ، مثلا نخوای دسترسی یک رول خاص به Edit یک صفحه خاص رو تعیین کنی (مثال : رول Customer بتواند گروه های کالا ها را مشاهده و ویرایش کند ولی قادر به حذف آن ها نباشد ) ، در ضمن برای استفاده از Membership خود دات نت یا باید از دیتابیس خودش که در شاخه دات نت روی هارد سرور نگهداری میشه استفاده کنی یا اجازه بدی جدول هاش رو توی دیتابیست اضافه کنه و مدیریت خاصی هم روش نداری . به نظر من بهترین کار اینه که یک RoleProvider اختصاصی بنویسی که برای Authentication از Membership خود دات نت استفاده کنی و برای Authorization خودت کد بنویسی و از Membership کمک بگیری

Vahid_moghaddam
سه شنبه 12 مرداد 1389, 12:40 عصر
می تونیم از system.web.security استفاده کنیم و همه مد رو خودمون بنویسیم. اینطوری به همه چیز تسلط داریم.

rana-writes
سه شنبه 12 مرداد 1389, 12:54 عصر
می تونیم از system.web.security استفاده کنیم و همه مد رو خودمون بنویسیم. اینطوری به همه چیز تسلط داریم.

سلام
میشه در این مورد بیشتر توضیح بدین آقای مقدم؟
آخه اینطوری که دوستان گفتن استفاده از Memebership یه جورایی برنامه نویس رو محدود میکنه
اگه توی دیتابیس Relation بین جدولها رو دستی کنترل کرد و دسترسی های کاربر رو توی session ریخت بازم خطرناکه؟
ممنون از راهنماییتون

Vahid_moghaddam
سه شنبه 12 مرداد 1389, 13:15 عصر
سلام
میشه در این مورد بیشتر توضیح بدین آقای مقدم؟
آخه اینطوری که دوستان گفتن استفاده از Memebership یه جورایی برنامه نویس رو محدود میکنه
اگه توی دیتابیس Relation بین جدولها رو دستی کنترل کرد و دسترسی های کاربر رو توی session ریخت بازم خطرناکه؟
ممنون از راهنماییتون
در احراز هویت دو چیز مهمه:
1.کاربر مجازه یا نه
2.سطح دسترسی کاربر به هر بخش، در چه حده.

مورد 2 به سادگی با استفاده از role قابل بررسیه.

کد های زیر بهینه نیستند و فقط به عنوان مثال گذاشته شدن:

login کردن:

//....
UserData ud = bm.IsUserExist(userName, Password, out mes);
bool ok = ud == null ? false : true;
if (ok)
{


DateTime expiration = new DateTime();
expiration = DateTime.Now.AddMinutes(20);
if (remember)
expiration = DateTime.Now.AddDays(14);
string userData = "";


string roles = bm.GetUserRolesString(ud.UserID);

userData = ud.UserID.ToString() + "-" + roles;

FormsAuthenticationTicket Ticket = new FormsAuthenticationTicket(1, ud.Name, DateTime.Now, expiration, true, userData, FormsAuthentication.FormsCookiePath);
string encTicket = FormsAuthentication.Encrypt(Ticket);
HttpCookie c = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);

if (remember)

c.Expires = Ticket.Expiration;
Response.Cookies.Add(c);


string strRedirect = string.Empty;
strRedirect = Request.QueryString["ReturnUrl"];
if (strRedirect == null)
{
Response.Redirect(Request.Url.AbsoluteUri);
}
else
{
Response.Redirect(strRedirect);
}


}
//.....

برای چک کردن اینکه کاربر احراز هویت شده:

if (Context.User.Identity.IsAuthenticated)
{
//.....
}

برای کار با نقش ها(فرض کنید رشته roles در کد بالا به این شکله 0_0|0_1|1_20)
در Global.asax


protected void Application_AuthenticateRequest(object sender, EventArgs e)
{

// look if any security information exists for this request

if (HttpContext.Current.User != null)
{

// see if this user is authenticated, any authenticated cookie (ticket) exists for this user

if (HttpContext.Current.User.Identity.IsAuthenticated )
{

// see if the authentication is done using FormsAuthentication

if (HttpContext.Current.User.Identity is FormsIdentity)
{

// Get the roles stored for this request from the ticket

// get the identity of the user

FormsIdentity identity = (FormsIdentity)HttpContext.Current.User.Identity;

// get the forms authetication ticket of the user

FormsAuthenticationTicket ticket = identity.Ticket;

// get the roles stored as UserData into the ticket
string _roles = ticket.UserData.Split('-')[1];
string[] roles = _roles.Split('|');

// create generic principal and assign it to the current request

HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(identit y, roles);

}

}

}

}

و خوندن نقش ها:

if ((User.Identity.IsAuthenticated) && (User.IsInRole("10_4")))
{
//......
}


برای مشخص کردن سطح دسترسی در web.config :


<location path="edituser.aspx">
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</location>

دوباره در web.config اگه بخوایم دسترسی رو به داشتن نقش خاصی محدود کنیم:


<location path="mcat.aspx">
<system.web>
<authorization>
<allow roles="6_4"/>
<deny users="*"/>
</authorization>
</system.web>
</location>

rana-writes
سه شنبه 12 مرداد 1389, 14:17 عصر
ممنون از وقتی که گذاشتین و زحمتی که کشیدین
باید کدها رو تو برنامه بذارم تا بدونم چی به چیه و بتونم برای برنامه خودم ازش استفاده کنم
ولی یه سوال دیگه
با استفاده از این روش، دیگه نیازی به استفاده از بانکی که خود Asp.Net ایجاد میکنه نیست، درسته؟ یعنی این خط کد شما


02.UserData ud = bm.IsUserExist(userName, Password, out mes);

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

سپاس

Vahid_moghaddam
سه شنبه 12 مرداد 1389, 14:29 عصر
ممنون از وقتی که گذاشتین و زحمتی که کشیدین
باید کدها رو تو برنامه بذارم تا بدونم چی به چیه و بتونم برای برنامه خودم ازش استفاده کنم
ولی یه سوال دیگه
با استفاده از این روش، دیگه نیازی به استفاده از بانکی که خود ASP.NET ایجاد میکنه نیست، درسته؟ یعنی این خط کد شما


02.UserData ud = bm.IsUserExist(userName, Password, out mes);
فراخوانی تابعیه که صحت نام کاربری و پسورد رو از توی بانک چک میکنه؟
من تا حالا با Membership کار نکردم، برای همین هیچ اطلاعاتی در موردش ندارم، البته مطلب زیاد سرچ کردم ولی انگار یه جورایی غریب میاد برام ..

سپاس

نه. نداره. شما اطلاعات رو از جدول های خودتون می خونید

rana-writes
سه شنبه 12 مرداد 1389, 17:02 عصر
ممنونم
یه سوال دیگه
شما اینجا نقش ها رو از توی بانک میخونین


string roles = bm.GetUserRolesString(ud.UserID);

این نقشها رو از توی Role خود Asp.Net ایجاد میکنین؟ البته با توجه به جواب بالا فکر کنم از توی بانک میخونین
پس در این حالت هر کاربر میتونه یه نقش داشته باشه
سایتی که من دارم روش کار میکنم طوریه که یه کاربر میتونه چندتانقش داشته باشه
مثلا همزمان میتونه مدیر پستها و نویسنده و مدیربخش مسابقه باشه
برای تعریفشون من اینطوری عمل کردم
یه جدول به اسم UserType دارم که دو تا فیلد داره: UserTypeCode و UserTYpe
مثلا 1 عضو عادی
5 مدیر مسابقه
توی جدول لاگین هم این فیلدها رو دارم
UserName, Pass, P1 , P2 , P3 , ....
حالا اگه کاربر مثلا مدیرمسابقه باشه، مقدار فیلد P5 رو عدد 5 قرار میدم
و با توجه به مقادیر این Pها پنلهای مورد نظر مدیریتی برای کاربرهام فعال میشن
به نظر شما توی همچین حالتی باید چطوری عمل کنم؟
ممنونم

mmnoody2006
سه شنبه 12 مرداد 1389, 19:19 عصر
آقا لطفا یه نمونه برنامه کامل در این ضمینه معرفی کنید

Vahid_moghaddam
سه شنبه 12 مرداد 1389, 22:00 عصر
نه. کاربر می تونه چند تا نقش داشته باشه.
روشی که من استفاده می کنم اینطوریه که مثلا برای بخش x سه تا سطح دسترسی دارم. برای این بخش مثلا عدد 1 رو در نظر می گیرم و سه سطح رو هم با 1, 2 ,3 مشخص می کنم. حالا وقتی نقشهای کاربر رو می خونم اونها رو به این شکل در میارم 1_1, 1_2, 1_3 و در userdata به صورت 1_1|1_2|1_3 وارد می کنم. با split کردن این رشته روی کاراکتر| و _ نقش رو از userdata بیرون می کشم

rana-writes
سه شنبه 12 مرداد 1389, 22:56 عصر
در مورد دسترسیهای که توی وب کانفیگ نوشتین
اصلا اگه اینها رو نذاریم اتفاقی می افته؟
یعنی از همین کدی که نوشتین :


if ((User.Identity.IsAuthenticated) && (User.IsInRole("10_4")))

برای فعال کردن پنل مدیریت صفحات مدیریتی استفاده کنیم کافیه؟
یا مثلا توی پیج لود صفحات این کد رو بذارم و اگه این شرط برقرار نبود کاربر رو به یه صفحه دیگه هدایت کنیم درسته؟

خیلی ممنونم از همه ی راهنمایی های خوبتون که واقعا بهم ایده میدن

Vahid_moghaddam
سه شنبه 12 مرداد 1389, 23:08 عصر
در مورد دسترسیهای که توی وب کانفیگ نوشتین
اصلا اگه اینها رو نذاریم اتفاقی می افته؟
یعنی از همین کدی که نوشتین :


if ((User.Identity.IsAuthenticated) && (User.IsInRole("10_4")))
برای فعال کردن پنل مدیریت صفحات مدیریتی استفاده کنیم کافیه؟
یا مثلا توی پیج لود صفحات این کد رو بذارم و اگه این شرط برقرار نبود کاربر رو به یه صفحه دیگه هدایت کنیم درسته؟

خیلی ممنونم از همه ی راهنمایی های خوبتون که واقعا بهم ایده میدن

توی web.config بهتره. مثلا فرض کنید، یه صفحه که برای کاربر مجاز نیست، مجاز بشه. یا سطح دسترسیش تغییر کنه. دیگه نیاز به تغییر کد نیست. اینکه از نظر امنیتی بهتره یا نه، نمی دونم.

Vahid_moghaddam
سه شنبه 12 مرداد 1389, 23:26 عصر
شما می تونید یه فولدر بسازید، دسترسی رو برای اون فولدر به همون روشی که گفتم تعیین کنید و فایل ها رو بریزید توی اون

|Smyty|
سه شنبه 12 مرداد 1389, 23:47 عصر
اصلا session استفاده نکن ! ( مثلا متد session hijacking )

amordad
چهارشنبه 13 مرداد 1389, 05:56 صبح
دوست من سلام و خسته نباشید
ایرادی که membership دارد این است که تمام تنظیمات و فیلدها و.. دست خودش و اصلا تو بانک خودش (sql expressموجود در دات نت) هست، و برای هر تغییری باید profile اضافه کنی و...
اما بهتر است شما از کلاس roleprovider ارث بری کنی وخودت و با ثبت کردن آن provider درwebconfig
membership دات نت را به جداول بانک خودت وصل کنی آن موقع محدودیتات هم از بین میره
من برای شما یک مثال کامل با بانکش ساختم و دانلودش کن و...
در ضمن دو پوشه customer و admin هم برای دو نوع دسترسی مختلف تعریف شده اند

abdorreza
چهارشنبه 13 مرداد 1389, 10:49 صبح
يعني اگر از Membership خود ASP استفاده كنيم ، ديگه نميتونيم فيلدهايي اضافي كه خودمان ميخواهيم به جداول Membership اضافه كنيم؟

rana-writes
چهارشنبه 13 مرداد 1389, 11:44 صبح
يعني اگر از Membership خود ASP استفاده كنيم ، ديگه نميتونيم فيلدهايي اضافي كه خودمان ميخواهيم به جداول Membership اضافه كنيم؟

سلام
نه
تا جایی که من این چند روز سرچ کردم، وقتی از Membership خود Asp استفاده می کنیم یه بانک به طور خودکار توی App_Data قرار میگیره برای کاربران
حالا اینکه چطوری باید ربطش داد به بانک خودمون رو بلد نیستم
ولی کدهایی که آقای مقدم توی پستهای قبل گذاشتن میتونه جوابگو باشه
یعنی شما عملا هم بانک خودتون رو داشته باشین هم از تکنولوژی FormAuthentication استفاده کنین هم از Session استفاده نکنین
موفق باشین

abdorreza
چهارشنبه 13 مرداد 1389, 12:28 عصر
ممنون .

آره اين خوبه كه بانك خودمو داشته باشم و از Web.Security براي كنترل كاربران سايت استفاده كنم.

A.S.Roma
چهارشنبه 13 مرداد 1389, 14:31 عصر
سلام
نه
تا جایی که من این چند روز سرچ کردم، وقتی از Membership خود Asp استفاده می کنیم یه بانک به طور خودکار توی App_Data قرار میگیره برای کاربران
حالا اینکه چطوری باید ربطش داد به بانک خودمون رو بلد نیستم
ولی کدهایی که آقای مقدم توی پستهای قبل گذاشتن میتونه جوابگو باشه
یعنی شما عملا هم بانک خودتون رو داشته باشین هم از تکنولوژی FormAuthentication استفاده کنین هم از Session استفاده نکنین
موفق باشین

شما دیتابیستو رو بساز بعد برو این قسمت :


Start -> All Programs -> Microsoft Visula Studio 2008 -> Visual Studio Tools -> Visual Studio 2008 Command Prompt ->

سپس دستور aspnet_regsql را تایپ کنید و ویزارد را دنبال کنید تا جدول های Membership به دیتابیس انتخابی شما اضافه شوند .

mmnoody2006
چهارشنبه 13 مرداد 1389, 20:01 عصر
آره اين خوبه كه بانك خودمو داشته باشم و از Web.Security براي كنترل كاربران سايت استفاده كنم.

بیشتر توضیح بدید لطفا

hlikehamed
چهارشنبه 13 مرداد 1389, 20:57 عصر
حالا که بحث اهراز هویت داغه منم یه سوال داشتم.
جواب هایی که وجود داره یکم گنگه.
تا اونجایی که من میدونم اگر mod اهراز هویت رو فرم انتخاب کنیم توی هر صفحه ای بخوایم بریم وارد صفحه Login میشه تا کاربر لوگین کنه. توی جستجو هام دیدم که میشه چندتا صفحه رو اینکار رو کرد که شامل اهراز هویت نشه مثلا فرم ثبت نام.که باید آدرس تک این صفحات رو توی تنظیمات وب کانفیگ اضافه کرد.
می خوام بدونم برعکس این قضیه امکان پذیره؟
منظورم اینه که همه سایت در دسترس باشه به جز بعضی صفحات؟
یا مثلا یه بخشی که توسط folder از کل سایت جدا شده؟

Vahid_moghaddam
چهارشنبه 13 مرداد 1389, 21:16 عصر
حالا که بحث اهراز هویت داغه منم یه سوال داشتم.
جواب هایی که وجود داره یکم گنگه.
تا اونجایی که من میدونم اگر mod اهراز هویت رو فرم انتخاب کنیم توی هر صفحه ای بخوایم بریم وارد صفحه Login میشه تا کاربر لوگین کنه. توی جستجو هام دیدم که میشه چندتا صفحه رو اینکار رو کرد که شامل اهراز هویت نشه مثلا فرم ثبت نام.که باید آدرس تک این صفحات رو توی تنظیمات وب کانفیگ اضافه کرد.
می خوام بدونم برعکس این قضیه امکان پذیره؟
منظورم اینه که همه سایت در دسترس باشه به جز بعضی صفحات؟
یا مثلا یه بخشی که توسط folder از کل سایت جدا شده؟
پست شماره 14 رو در همین تاپیک ببینید.

وقتی شما احراز هویت رو برابر form قرار می دید، فقط صفحه ها و location هایی که تعریف می کنید (در web.config) نیاز به تایید هویت دارند. شما بر عکس گفتید.

mohsen507
چهارشنبه 20 مرداد 1389, 21:06 عصر
دوست من سلام و خسته نباشید
ایرادی که membership دارد این است که تمام تنظیمات و فیلدها و.. دست خودش و اصلا تو بانک خودش (sql expressموجود در دات نت) هست، و برای هر تغییری باید profile اضافه کنی و...
اما بهتر است شما از کلاس roleprovider ارث بری کنی وخودت و با ثبت کردن آن provider درwebconfig
membership دات نت را به جداول بانک خودت وصل کنی آن موقع محدودیتات هم از بین میره
من برای شما یک مثال کامل با بانکش ساختم و دانلودش کن و...
در ضمن دو پوشه customer و admin هم برای دو نوع دسترسی مختلف تعریف شده اند


سلام

متاسفانه به همين سادگي نيست شما در كلاس roleProvider فقط يكي از متدها رو پياده سازي كرديد

پياده سازي بقيه متدها مثل AddUsersToRoles CreateRole FindUsersInRole GetUsersInRole ....

مستلزم تسلط كامل بر membership هست
اگر كسي به اين قضيه تسلط نداشته باشه به مشكل بر ميخوره

و اگر ميخواهيد از اين روش استفاده كنيد همه جوانبشو در نظر بگيريد

moj_asghary
یک شنبه 31 مرداد 1389, 23:23 عصر
این که عده ای طرفدار متعصب استفاده از Session در پروژه هاشون هستند منو یاد net 1.1. میندازن و همین طور سطح سوادشون رو میرسونه بارها گفته شده که استفاده از Session هم از نظر امنیت هم از نظر بار اضافی روی سرور (بازای هر User که وارد سایت میشه یک فضایی در نظر گرفته میشه حالا شما حساب کار خودت رو بکن) و هم حدف Session در بعضی از هاستها، برای طراحی سایت به صلاح برنامه نویس نیست

راه حل شما چیه ؟ همه که مادر زادی برنامه نویس نیستن !
تا یاد بگیرن فعلا سیشن راحت ترینه !
اما نظر شما چیه ؟ اکه لطف کنین و یک لینک آموزش هم بذارین ممنون میشم. ایرانی خارجی فرقی نداره !

به هر حال ما چه کار کنیم ؟ دوستان خوب شماها که جواب میدین، صرف 2 خط جواب دادن که دردی از کسی دوا نمیشه ! مثالی، مقاله ای، راهی تا بشه از بهترین روش استفاده کرد.

imanasp
دوشنبه 01 شهریور 1389, 00:00 صبح
همه که مادر زادی برنامه نویس نیستن !
تا یاد بگیرن فعلا سیشن راحت ترینه !


منظورم با کاربران حرفه ای بود که تا حالا سایتهای زیادی رو طراحی کردند ولی بازم با وجود اشکالات Session تمایل استفاده به از اون رو دارند و تعریفش رو می کنند


اما نظر شما چیه ؟اگه پستها رو به خوبی نگاه کنی متوجه میشی. پست 11و 14 و 24 رو با دقت بخون


دوستان خوب شماها که جواب میدین، صرف 2 خط جواب دادن که دردی از کسی دوا نمیشه !مبحث امنیت در دات نت مبحث کوچیکی نیست که بشه یک پست n صفحه ای گذاشت اگه بود کوچ مایکروسافت از .net 1.1 به .net 2.0 اینقدر تفاوت امنیت مثل اضافه شدن کلاسهای جدید و ... نداشت


اکه لطف کنین و یک لینک آموزش هم بذارین ممنون میشم. ایرانی خارجی فرقی نداره !سرچ کن!!
http://social.msdn.microsoft.com/Search/en-us?query=sample+membership
http://www.ASP.NET/web-forms/security
http://www.4guysfromrolla.com/articles/120705-1.aspx