PDA

View Full Version : آموزش: نکاتی درباره Login page



Alireza.AM
دوشنبه 11 دی 1391, 23:48 عصر
شما هنگامی به صفحه Login نیاز دارید که اطلاعات کاربرانتان را به خصوص ID و Password آنها را در یک پایگاه داده ها ذخیره کرده باشید، این پایگاه داده ها می تواند از انواع ساده مانند XML و یا انواع پیچیده RDBMS مانند SQL Database باشد.

در هر صورت به یاد داشته باشید که نگهداری از کلمات عبور بدون Encryption و یا Hash کردن به هیچ وجه قابل قبول نیست، من Hash را ترجیح می دهم چون در این مورد چیزی تحت عنوان DeHash وجود ندارد، شما می توانید در صفحه Registration که قرار است بواسطه آن یک رکورد برای هر کاربر جدید ثبت کنید، کلمات عبور را ابتدا Hash نموده و سپس ذخیره نمایید.

نکات Configuration

احتمالا می دانید که سه شیوه Authentication در .NET Framework پشتیبانی می شود، Windows، Forms و Passport، Windows Authentication هنگامی قابل استفاده خواهد بود که وظیفه Authenticateکردن را به عهده Domain Controller بگذارید، در این صورت نیازی به Login page هم نخواهید داشت، Passport وقتی مناسب خواهد بود که سایتهای یکپارچه ای داشته باشید که Authentication مشترک داشته باشند مانند سایتهای مختلف Google که در همه آنها با یک نام کاربری و کلمه عبور شناخته می شوید، گزینه مناسب برای مثال ما Forms است.

کد XML مربوط به Forms Authentication در Web.config


<authentication mode="Forms">
<forms loginUrl="LoginPage.aspx" protection="All">
</forms>
</authentication>


کد فوق هر درخواست برای هر صفحه ای را فقط به شرطی پاسخ می دهد که درخواست دهنده قبلا در صفحه LoginPage.aspx عملیات login را انجام داده باشد در غیر این صورت او را به این صفحه هدایت کرده و پس از انجام Login مجددا صفحه درخواست شده را Load می کند.

در مورد Authorization نیز توجه داشته باشید که دسترسی کاربران Anonymous را محدود کنید:


<authorization>
<deny users="?"/>
</authorization>


Identity tag را هم فراموش نکنید، در این حالت حتی اگر IIS دسترسی Ananymous را مجاز بداند، Web.config آنرا Override می کند.


<identity impersonate="true"/>

تابعی که من برای انجام Validation در صفحه Login نوشته ام، البته پیشنهاد می کنم که Connection String را Hash کنید.

Boolean Validateit(string uid, string pwd)
{
System.Data.SqlClient.SqlConnection cn = new System.Data.SqlClient.SqlConnection("Data Source=.;Initial Catalog=Training;Persist Security Info=True;User ID=guser;Password=123");
System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand("select id, fname, lname, uname, pwd from users", cn);
cn.Open();
System.Data.SqlClient.SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
if (txtUid.Text == dr.GetValue(3).ToString())
{

if (System.Web.Security.FormsAuthentication.HashPassw ordForStoringInConfigFile(txtPwd.Text, "MD5").ToString() == dr.GetValue(4).ToString())
{
fullname = dr.GetValue(1).ToString() + " " + dr.GetValue(2).ToString();
return true;
}
}
}
cn.Close();
return false;
}

استفاده از این تابع در Click event یک Button

protected void btnLgn_Click(object sender, EventArgs e)
{
if (Validateit(txtUid.Text, txtPwd.Text) == true)
{
System.Web.Security.FormsAuthentication.RedirectFr omLoginPage(fullname, false);
Session["username"]=fullname;
}
}


در ضمن، fullname یک متغیر رشته ای است که در Class Scope تعریف شده است.

به نظر من بهتر است برای صفحاتی مانند Login امکان Cache غیر فعال گردد، یک روش ساده استفاده از شیئ Response در Page load event است:


Response.CacheControl = "no-cache"

نکته آخر اینکه می‌توانید از Component های حاضر و آماده FrameWork هم استفاده کنید، مثل LoginControl و غیره، در هر صورت مفاهیم اجرا تغییری نخواهد کرد فقط به کد نویسی کمتری نیاز خواهید داشت ولی فراموش نکنید که کار سخت شما هنگام پیاده‌سازی منجر به یک Maintenance راحت خواهد شد البته به شرط اینکه زحمت موثری کشیده شده باشد.

malloc
دوشنبه 11 دی 1391, 23:54 عصر
دوست عزیز یه سوال فنی

وقتی پسورد و هش ذخیره میکنیم و کاربر رمزشو فراموش میکنه چیکار کنیم ؟؟؟؟؟

Alireza.AM
سه شنبه 12 دی 1391, 00:08 صبح
اگر Password رو Encrypt کرده باشید میتونید Decrypt کنیدش ولی در مورد Hash اینطور نیست. چون پیغام شمارو دیدم، یک مطلب در مورد Hashing و Encryption گذاشتم که شاید بد نباشه یک نگاهی بهش بندازید:

http://barnamenevis.org/showthread.php?376711-Hashing-%D9%88-Encryption&p=1664824#post1664824

malloc
سه شنبه 12 دی 1391, 00:17 صبح
لطف کردی جواب دادی دادشی اما منظور من این بود که اگه کاربر رمزشو فراموش کرد و رفت به صفحه بازیابی پسورد من چی و واسش ایمیل کنم که بتونه رمزشو بازیابی کنه

Alireza.AM
سه شنبه 12 دی 1391, 00:22 صبح
راستش این اصلا مرسوم نیست که اگر کاربر کلمه عبورش رو فراموش کرد بری و براش از توی database کلمه عبورش رو پیدا کنی و مثلا براش Email کنی. معمولا وقتی که کاربر کلمه عبورش رو فراموش میکنه شما ازش آدرس Email میگیری و کلمه عبورشو reset میکنی به یه رشته تصادفی . اونو براش میفرستی. حالا خودش اگه بخواد میتونه بره دوباره عوضش کنه.

Alireza.AM
سه شنبه 12 دی 1391, 00:31 صبح
از طریق همون ایمیلی که ازش میگیری رکوردش رو توی Database پیدا میکنی و کلمه عبورش رو reset میکنی و به همون آدرس ایمیل میفرستی. اگر هم آدرسی که داد رو توی database نداشتی که هیچی، بهش میگی چنین ایمیلی پیدا نشد. اینجوری خیالت هم راحته که کلمه عبور به دست صاحب رکورد که همون صاحب ایمیله میرسه چون خودش وقت ثبت نام این آدرس ایمیل رو داده.

Alireza.AM
سه شنبه 12 دی 1391, 00:41 صبح
امیدوارم تونسته باشم کمکی بکنم

malloc
سه شنبه 12 دی 1391, 00:47 صبح
قطعا کمک کردید

مرسی

AmirGhasemi
سه شنبه 12 دی 1391, 10:33 صبح
سلام دوست عزيز و خوبم عليرضا جان
بسيار بسيار ممنون از مطلبت!
اتفاقا چند روزي است كه براي Login مشكل دارم و مطلب شما هم كمكي برايم شده است
اما من مشكل اصلي ام در چند سوال زير است:
1- وقتي مثلا كاربر Login‌ كرد آيا بايد كوكي ساخته شود ؟؟؟؟ اگر اين طور است بعد چطوري بايد اين كوكي ها را بررسي كرد؟
2- مورد دوم و مهم من اينه كه من يك فولدر در پروژه ام دارم به نام Administartor كه داراي تعدادي فايل Aspx‌است !! من چطور مي توانم كل آن فولدر را بگونه اي معرفي كنم كه فقط پس از لاگين كردن به محتويات ان دسترسي باشد؟؟؟

Alireza.AM
سه شنبه 12 دی 1391, 11:09 صبح
سلام

خواهش می‌کنم. خوشحالم که این مطلب تونسته کمکی بکنه.

شما لزوما به Set کردن Cookie برای یک صفحه Login نیاز ندارید. بحث cookie ها وقتی اهمیت پیدا میکنه که شما بخواهید اطلاعاتی رو که قبلا از کاربر گرفته‌اید جایی روی دستگاه خودش ذخیره کنید تا دفعه بعد دوباره ازش نپرسید و این "جا" همون Cookie هستش. شما به عنوان برنامه نویس میتونید یک یا چند cookie برای هر کاربری که سایت شما رو میبینه روی دستگاهش ذخیره کنید. معمولا برای ترکیب هر سایت با یک کاربر یک cookie بیشتر روی client ذخیره نمیکنند.

در مورد قضیه login میتونید یک Checkbox کنار Login box بگذارید و مثلا کنارش بنویسید "مرا به خاطر داشته باش" به این معنی که دفعه بعد که کاربر خواست سایت رو ببینه مجبور نباشه برای Authenticate شدن دوباره ID وPassword وارد کنه. شما میتونید اگر خود کاربر خواست، نام کاربری و کلمه عبورش رو در یک cookie روی دستگاهش ذخیره کنید و هروقت که login page داره load میشه اول cookie رو چک کنید ببینید که ID وPassword توش دخیره شده یا نه. اگر ذخیره شده بود که Authenticate میکنیدش و اگر نه، براش Login box رو load میکنید. در ضمن cookie ها روی کامپیوترهای عمومی کاربردی ندارند. یعنی هیچوقت هیچ کاربری وقتی توی کافی نت داره به سایت شما login میکنه گزینه "مرا به خاطر داشته باش" رو تیک نمیزنه چون دلش نمیخواد نفر بعدی به اکانتش دسترسی داشته باشه.

پاسخ سوال دوم شما کمی بستگی به نسخه Framework و معماری پروژه‌تون داره ولی به طور کلی این قضیه مربوط به فایلهای config میشه. شما میتونید در Webconfig کلی پروژه‌تون بعضی folder هارو از روند کلی که برای security کل solution در نظر گرفته‌اید مستثنی کنید و یا اینکه برای هر folder و در هر folder یک فایل Config مجزا بسازید که security خاصی برای اون folder توش در نظر گرفته بشه.

درمورد cookie ها اگر دوست داشتید یه نگاهی به این چندتا لینک بندازید:

http://msdn.microsoft.com/en-us/library/ms178194(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/78c837bd(v=vs.100).aspx
http://msdn.microsoft.com/en-us/library/aa287533(v=vs.71).aspx
http://msdn.microsoft.com/en-us/library/aa287547(v=vs.71).aspx
http://www.codeproject.com/Articles/11069/all-thing-about-cookies-in-asp-net-c

امیدوارم تونسته باشم کمکی بکنم.

saeed_sho
سه شنبه 12 دی 1391, 16:11 عصر
سلام دوست عزيز و خوبم عليرضا جان
بسيار بسيار ممنون از مطلبت!
اتفاقا چند روزي است كه براي Login مشكل دارم و مطلب شما هم كمكي برايم شده است
اما من مشكل اصلي ام در چند سوال زير است:
1- وقتي مثلا كاربر Login‌ كرد آيا بايد كوكي ساخته شود ؟؟؟؟ اگر اين طور است بعد چطوري بايد اين كوكي ها را بررسي كرد؟
2- مورد دوم و مهم من اينه كه من يك فولدر در پروژه ام دارم به نام Administartor كه داراي تعدادي فايل Aspx‌است !! من چطور مي توانم كل آن فولدر را بگونه اي معرفي كنم كه فقط پس از لاگين كردن به محتويات ان دسترسي باشد؟؟؟
در فولدر مورد نظر یه وب کانفیگ بزارید بعد
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<location path="" allowOverride="false">
<system.web>
<authorization>
<deny users="?" />
</authorization>
</system.web>
</location>
</configuration>

Alireza.AM
سه شنبه 12 دی 1391, 19:51 عصر
به غیر از گذاشتن یک فایل config یا همون web.config در فولدر مورد نظر، که من بهش اشاره کرده بودم و دوستمون هم نمونه‌اش رو براتون گذاشتند یک راه کاربردی و آسون دیگه هم هست. اون هم اینه که یک ماژول برای چک کردن وضعیت Authentication کاربر بنویسید و بالای صفحاتی که نمیخواهید بدون login دیده بشن ازش استفاده کنید.

ساده ترین شکلش اینه که وقتی که کاربر login کرد شما یک server variable یا مثلا یک متغیر در session پر میکنید که به شما بگه که این کاربر login کرده یا نه و بعد بالای هر صفحه‌ای که خودتون فکر میکنید لازمه این متغیر رو چک میکنید. اگر login کرده بود که صفحه رو بهش نشون میدید اگر هم نه هدایتش میکنید به صفحه login.

البته لازمه این روش اینه که هم server به اندازه کافی ایمن باشه (که این جزو وظایف مدیر شبکه است) و هم شما به عنوان developer متغیرتون رو secure کرده باشید وگرنه کار خطرناکیه و هکرها به راحتی میتونن مقدار متغیرتون رو به مقدار دلخواه تغییر بدن.

Alireza.AM
چهارشنبه 13 دی 1391, 14:14 عصر
سلام. مثل اینکه من اشتباها به جای جواب دادن به شما به پست خودم جواب دادم. خواستم بهتون خبر بدم که سعی کردم به سوالتون پاسخ بدم. می‌تونید جواب‌های من رو زیر تاپیک بخونید
موفق باشید

judgment
چهارشنبه 13 دی 1391, 14:51 عصر
چند سوال فنی دیگه دوست عزیز
اگر ما بخوایم کاربر وقتی لاگین کرد براساس role اون کاربر (برای مثال کاربرای admin) اجازه دسترسی به صفحه رو داشته باشن چه کاری باید کنیم؟
چون این جوری هر کاربری که لاگین کرد به صفحه ما دسترسی داره.
سوال دیگه اینکه چجوری تشخیص بدیم کاربر مدیر لاگین کرده یا کاربر عادی و منوهایی که کاربر عادی اجازه دسترسی به اونها رو نداره مشاهده نکنه؟

Alireza.AM
چهارشنبه 13 دی 1391, 15:11 عصر
بهتره که برای دسترسی ها یک یا چند table توی پایگاه داده‌ها تون داشته باشید. در مفصل‌ترین حالت به غیر از table اطلاعات کاربران (که شامل اطلاعاتی مثل نام کاربری و کلمه عبور کاربرها میشه) به یک table برای Role ها و یک table به عنوان table واسط بین دو table قبلی نیاز دارید.

اگر ارتباط هر کاربر با Role یک ارتباط یک به یکه اصلا به table سوم نیازی ندارید و کافیه که Primary key جدول Role ها رو به عنوان Foreign key در table اطلاعات کاربران قرار بدید و به این ترتیب یک Relation بین این دو تا table درست کنید. ولی اگر قراره که هر کاربر بتونه بیش تر از یک نقش داشته باشه باید از یک table سوم به عنوان table واسط استفاده کنید.

بعد از اینکه ساختار پایگاه داده‌هاتون آماده شد باید یک ماژول برای Authorization کاربر بنویسید و در Page load هر فرمی که صلاح می‌دونید ازش استفاده بکنید.

sinayas
چهارشنبه 13 دی 1391, 15:42 عصر
به غیر از گذاشتن یک فایل config یا همون web.config در فولدر مورد نظر، که من بهش اشاره کرده بودم و دوستمون هم نمونه‌اش رو براتون گذاشتند یک راه کاربردی و آسون دیگه هم هست. اون هم اینه که یک ماژول برای چک کردن وضعیت Authentication کاربر بنویسید و بالای صفحاتی که نمیخواهید بدون login دیده بشن ازش استفاده کنید.

ساده ترین شکلش اینه که وقتی که کاربر login کرد شما یک server variable یا مثلا یک متغیر در session پر میکنید که به شما بگه که این کاربر login کرده یا نه و بعد بالای هر صفحه‌ای که خودتون فکر میکنید لازمه این متغیر رو چک میکنید. اگر login کرده بود که صفحه رو بهش نشون میدید اگر هم نه هدایتش میکنید به صفحه login.

البته لازمه این روش اینه که هم server به اندازه کافی ایمن باشه (که این جزو وظایف مدیر شبکه است) و هم شما به عنوان developer متغیرتون رو secure کرده باشید وگرنه کار خطرناکیه و هکرها به راحتی میتونن مقدار متغیرتون رو به مقدار دلخواه تغییر بدن.

سلام
ممنون از توضیحات شما .
من شخصا ترجیح میدم که به صورت دستی این کار رو انجام بدم . یعنی با همون session .
شما در مورد امن کردن متغیر صحبت کردین . خوشحال میشم اگه در این مورد راهنمایی بکنبد . منظور از امن کردن چیه و چطوری باید این کار رو بکنیم .

ممنون از شما

Alireza.AM
چهارشنبه 13 دی 1391, 18:52 عصر
احتمالا میدونید که هکرها متغیرهایی رو که اطلاعات به صورت plain (ساده) در اونها نگه داشته میشه خیلی دوست دارن چون به راحتی میتونن بخوننشون. منظور از امن کردن متغیر اینه که اطلاعات رو اول Encrypt و یا Hash می‌کنیم و بعد در متغیر ذخیره می‌کنیم.

برای این که موضوع واضح تر بشه سناریویی رو که خودم در این مورد استفاده می‌کنم بهتون میگم:

فرض کنیم که کاربر شما login کرده و شما می‌خواهید برای این login یک متغیر Session ذخیره کنید. پیشنهاد من اینه که بعد از اینکه login با موفقیت انجام شد password کاربر رو hash کنید و در یک متغیر Session ذخیره کنید. User name رو هم در یک متغیر session دیگه به صورت plain نگه دارید. حالا فرض می‌کنیم که وقت load یکی از فرم‌هاتون میخواهید مطمئن بشید که کاربر login کرده یا نه. متغیری که user name رو توش نگه داشتید میخونید. بعد توی database میگردید تا password رو هم پیدا کنید. password رو hash میکنید و با مقداری که به صورت hash شده در یکی از متغیرها نگه داشته بودید مقایسه می‌کنید. اگر با هم تطبیق داشتند صفحه رو بهش نشون میدید واگر تطبیق نداشت هدایتش میکنید به صفحه login

این قضیه hash کردن هم به این دلیله که اگر یک hacker به متغیرتون دست رسی پیدا کرد نتونه ازش سر در بیاره.

اگر دلتون خواست برای اطلاعات بیشتر در مورد hashing میتونید به این یادداشت من یک نگاهی بندازید:

Hashing و Encryption (http://barnamenevis.org/showthread.php?376711-Hashing-%D9%88-Encryption)

موفق باشید

judgment
پنج شنبه 14 دی 1391, 11:40 صبح
اینجوری سوالم و مطرح کنم
در ابتدا شما روشی رو بیان کردین که تونستیم با اون روش تشخیص بدیم کاربر لاگین کرده، حالا بعد از اینکه لاگین کرد باید چجوری تشخیص داد role کاربر چی هست؟
از دستور allow role="admin" استفاده کنیم داخل وب کانفیگ و بعد یک فیلد رول داخل جدول ایجاد کنیم یا کار دیگه ای باید انجام داد؟

Alireza.AM
پنج شنبه 14 دی 1391, 11:45 صبح
منظورتون role در Active Directory شبکه هستش؟ مثلا Admin شبکه یا User شبکه و این جور role ها؟

judgment
پنج شنبه 14 دی 1391, 14:59 عصر
نه منظورم همون role در جدولم هست که شما فرمودین.
برای مثال کاربرای وب سایت فرضی من manager, admin, user هستن، می خوام وقتی کاربر لاگین میکنه تشخیص بدم کاربر کدوم role لاگین کرده و بعد از منویی که دارم داخل صفحه اصلی کدوم آیتمهای منو به کاربر نشون داده بشه.
برای مثال اگر کاربر ما manager هست تمام منوها رو مشاهده کنه و اگر کاربر admin هست یک سری از منوها رو مشاهده کنه و همینطور برای کاربر user

Alireza.AM
پنج شنبه 14 دی 1391, 16:40 عصر
پس منظورتون رو از همون اول درست متوجه شده بودم. پاسخ من رو در رابطه با ساخت table های security خوندید؟ اگر خوندید پس احتمالا در مورد آخرین جمله من سوال براتون پیش اومده. بعد از اینکه توضیح دادم که table های users, Roles و table واسط که اسمش میتونه Users-Roles باشه چطور باید ساخته بشن نوشتم که:

"بعد از اینکه ساختار پایگاه داده‌هاتون آماده شد باید یک ماژول برای Authorization کاربر بنویسید و در Page load هر فرمی که صلاح می‌دونید ازش استفاده بکنید"

با توجه به راه حلی که من پیشنهاد کردم شما حالا باید query بنویسید تا متوجه بشید که user که login کرده چه role یا چه role هایی داره و بر اساس اون role یا role ها اجازه های لازم رو بهش بدید.

پیشنهاد می‌کنم که برای مجوز ها هم یک table در نظر بگیرید. Table مجوزها باید از طریق یک table واسط با جدول Role ها relation داشته باشه.

طبیعیه که اگر تا به حال این کارو نکرده باشید اولش کمی به نظرتون مبهم میاد ولی این pattern خیلی متدواله و بعد از یک بار انجام دادن برای اجراهای بعدی هیج جیز پیجیده‌ای نداره

judgment
پنج شنبه 14 دی 1391, 20:39 عصر
ممنون دوست عزیز از راهنمایی که کردی خیلی مفید بود
از لینک زیر هم استفاده کردم و اون چیزی رو که می خواستم بدست آوردم
http://www.codeproject.com/Articles/2905/Role-based-Security-with-Forms-Authentication

aminmorteza
پنج شنبه 14 دی 1391, 23:31 عصر
سلام بنده از این روش استفاده میکنم یه فیلدی تویه جدول کاربران ایجاد کردم به نام urlID که با استفاده از متد getHashcode به اون مقدار میدم یعنی gethashcode نام کاربری رو قرار میدم تویه urlID و سپس وقتی کاربر لاگین میکنه نام کاربری و UrlID رو هم قرار میدم تویه یک سشن.البته از UrlID که تویه سشن قرار دادم خیلی استفاده نکردم.تویه صفحاتی که کاربر ابتدا باید لاگین کنه از این کد استفاده کردم:



if (Session["UserName"] != null)
{
string username = ((UserINfo)Session["UserName"])._UserName;

if (!SDKClass.SettingRoles(username, "AccessPageUsers"))
{
Response.Redirect("Main.aspx");
}
if (!SDKClass.SettingRoles(username, "InsertUsers"))
{
Button_Update.Enabled = false;
}




}
else
Response.Redirect("../Index.aspx");

نظرتون در مورد روش بنده چیست؟مشکل امنیتی نداره؟

judgment
جمعه 15 دی 1391, 14:10 عصر
استفاده از session برای احراز هویت امنیت نداره، هکرها به راحتی با استفاده از session injection به راحتی مقدار session رو بدست میارن بهترین راه همون راه حلی است که دوست عزیزمون Alireza.AM توضیح دادن در ابتدای کار

Alireza.AM
جمعه 15 دی 1391, 18:45 عصر
البته متغیر session هم اگر امن بشه (مثلا مقدارش hash بشه) خطرش کمتر میشه

bitcob589
سه شنبه 19 دی 1391, 20:58 عصر
از چه نوع دکمه برای خروج کاربر گذاشته شود و در پشت دکمه خروج چه کدهای باید نوشت
و چگونه می توان session موجود در پروژه را در هنگام خروج پاک کرد

Alireza.AM
سه شنبه 19 دی 1391, 21:19 عصر
نوع button چندان اهمیتی نداره
اگر ُSecurity رو در Webconfig روی Forms Authentication تنظیم کردین میتونید از متد SignOut خود شیء FormsAuthentication برای logout استفاده کنید
برای اطلاعات بیشتر یک نگاهی به این دوتا لینک بندازید:

http://msdn.microsoft.com/en-us/library/system.web.security.formsauthentication.signout.as px

http://www.codeproject.com/Questions/400383/How-to-Logout-the-session-in-csharp-net

bitcob589
سه شنبه 19 دی 1391, 21:40 عصر
در سایت codeproject دستور زیر بود وظیفه این دستور چیست و در کجا باید استفاده شود

Response.Cache.SetNoStore();

Alireza.AM
سه شنبه 19 دی 1391, 21:59 عصر
همونطور که احتمالا حدس زدید این دستور مربوط به شیئ Cache هستش. احتمالا در مورد Cache چیزهایی میدونید. اطلاعات Cache میشن تا دسترسی بهشون در فراخوانهای بعدی سریعتر بشه.

دستوری که بهش اشاره کردید مشابه متد NoCache عمل میکنه. یعنی وقتی در Page Load Event هر فرمی نوشته بشه باعث میشه که اون صفحه Cache نشه. معمولا صفحاتی که حاوی اطلاعات حساس هستند و یا قراره که در هربازدید اطلاعاتی رو از پایگاه داده‌ها بخونن و نمایش بدن حاوی این کد هستند تا هیچوقت از حافظه بازیافت نشن و همیشه اطلاعاتشون از پایگاه داده ها load بشه. در این مورد هم پیشنهاد نویسنده مقاله اینه که صفحه login رو cache نکنید تا وضعیت login در مورد کاربر از حافظه cache خونده نشه و در هر دفعه بازدید از صفحه login این وضعیت مجددا روی server چک بشه.

اگر دوست داشتید یک نگاهی به این لینک بندازید:

http://forums.asp.net/t/1349599.aspx/1

hashemi85sep
چهارشنبه 20 دی 1391, 09:23 صبح
سلام دوست عزیز
من یه پیشنهاد دارم که بارها هم توی همین سایت پیشنهاد شده ولی به انتها نرسیده .
بهتره که از اول روشی رو که خودتون برای ثبت نام کاربر و ورود به سایت و حق دسترسی اونا استفاده میشه رو از اول و به صورت عملی توضیح داده بشه تا اینکه هر دو روز یک بار در این مورد پست ارسال نشه و بعد از اتمام تمامی کار هر کدوم از دوستان نظر یا پیشنهاد و سوالی در مورد کار شما داشتن ارائه بدن ...

منم خودم سعی میکنم تا یه فایل word یا pdf از کاری که خودم انجام میدم و بقیه دوستان توصیه کردن تهیه کنم و در انتهای توضیحات شما قرار بدم .

اگه موافق هستین بگین و از دوستان هم خواهش میشه که هیچ پستی تا پایان کار شما نزارن.

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

Alireza.AM
چهارشنبه 20 دی 1391, 10:04 صبح
سلام

بله، پیشنهاد خیلی خوبیه. فقط یکی دوتا موضوع کوچیک باقی میمونه:

اگر دقت کرده باشید من این تاپیک رو با موضوع دیگه‌ای شروع کردم و نمونه کدم رو هم به صورت کامل در همون پست اول آوردم.

طبیعیه که بقیه دوستان زیر هر پستی سوالهای مرتبط رو مطرح میکنن تا جوابهاشون رو بگیرن. سوالهایی هم که زیر این تاپیک مطرح شدن همه به login page مربوط میشن ولی هرکدوم به یک موضوع جداگانه اشاره میکنن.

طبیعیه که این فرصت برای همه ما وجود نداره که برای هر سوال جدید یک نمونه کد مفصل آماده و پست بکنیم ولی اگر کسی این فرصت رو داشته باشه خیلی هم عالی میشه. فایل word یا pdf شما هم مطمئنا به دوستانتون کمک میکنه. خیلی هم فکر خوبیه.

موفق باشید

zahrashoja
دوشنبه 21 اسفند 1391, 17:26 عصر
کد XML مربوط به Forms Authentication در Web.config


<authentication mode="Forms">
<forms loginUrl="LoginPage.aspx" protection="All">
</forms>
</authentication>


کد فوق هر درخواست برای هر صفحه ای را فقط به شرطی پاسخ می دهد که درخواست دهنده قبلا در صفحه LoginPage.aspx عملیات login را انجام داده باشد در غیر این صورت او را به این صفحه هدایت کرده و پس از انجام Login مجددا صفحه درخواست شده را Load می کند.


با تشکر از مطلب خوب و مفیدتون
من فرم لاگینم رو با یه WebUserControl نوشتم و توی صفحه هایی که لازمش دارم لودش میکنم (توی چنتا صفحه فرم لاگین هست)و همچنین خب تعدادی هم صفحه هست بدون لاگین هم میشه دیدشون تکلیف اینا چیه؟
آیا میشه اینکارو با چک کردن session انجام داد و در صورت خالی بودن اون صفحه مورد نظر لود نشه؟

Alireza.AM
سه شنبه 22 اسفند 1391, 09:53 صبح
خواهش می‌کنم.

به نظر میرسه که شما دو راه در پیش رو دارید:

1-اصلا از Forms Authentication استفاده نکنید و پروسه Authentication رو خودتون handle کنید. در این صورت جواب سوال شما در مورد روش چک کردن Session مثبته ولی با Forms Authentication در هر صورت کاربری که لاگین نکرده به صفحه لاگین هدایت میشه.

2-صفحاتی رو که بدون Authentication قابل دیدن هستند رو در یک Folder جداگانه قرار بدید و یک فایل Config مجزا برای اونها در نظر بگیرید.

bitcob589
چهارشنبه 23 اسفند 1391, 23:09 عصر
با توجه به اینکه نام کاربری در سشن ذخیره می شود چگونه می توان کاربران آنلاین را نمایش داد

behrozi.ir
چهارشنبه 23 اسفند 1391, 23:20 عصر
با توجه به اینکه نام کاربری در سشن ذخیره می شود چگونه می توان کاربران آنلاین را نمایش داد
با استفاده از global.asax

Samtak
چهارشنبه 23 اسفند 1391, 23:56 عصر
چطور می تونم در فایل پیکربندی سایتم (Web.config) در قسمت Authentication از چند DefaultUrl استفاده کنم مثلا می خوام اگه کاربری از نوع x وارد شد بره به یک صفحه درون یک پوشه و اگه کاربری از نوع y وارد شد بره به صفحه دیگه ای درون پوشه دیگه ای (نوعشون رو درون کدنویسی دکمه Login مشخص می کنم)

bitcob589
پنج شنبه 24 اسفند 1391, 00:22 صبح
با استفاده از global.asax
اگر امکان دارد بیشتر توضیح دهید (چه کدی باید در global.asax نوشته شود )