PDA

View Full Version : سوال: بستن لاگین در صورتی که کاربر چند بار نام کاربری و کلمه عبور را اشتباه وارد کند؟



hamedd82
پنج شنبه 26 مرداد 1391, 17:25 عصر
سلام به همه دوستان
چطوری میشه که یک کاربر زمانی که نام کاربری خودشو 2 یا 3 بار اشتباه وارد کرد تا یه مدت زمانی نتونه لاگین کنه؟

ممنون میشم کمک کنید

mehdi_gerami65
پنج شنبه 26 مرداد 1391, 17:53 عصر
سلام به همه دوستان
چطوری میشه که یک کاربر زمانی که نام کاربری خودشو 2 یا 3 بار اشتباه وارد کرد تا یه مدت زمانی نتونه لاگین کنه؟

ممنون میشم کمک کنید


با سلام شما بايد براي اين كار در قسمت لاگين يك Application["usercount "] تعريف كنيد هر بار كه كاربر لاگين ميكنه تعداد اونوبشمري برزيزي داخل اون بعد مقايسه كني اگه بيشتر از 3 بار شد ديگه نذاري كاربر لاگين كنه بعد ياد نره كه اونو خالي كني چون تا زمان از كار افتادن سايت رو حافظه ميمونه چون يه مرتبه از سي‍ن بالاتر است موفق باشي اگه باز مشكلي بود من در خدمت شما هستم

hamedd82
پنج شنبه 26 مرداد 1391, 20:41 عصر
میشه با یه مثال توضیح بدین من یکم گیج شدم
Application["usercount "] کجا و چجور تعریف کنم و چجوری بفهمم که کاربر از سایت خارج شده که مقدارشو خالی کنم

dorparasti
پنج شنبه 26 مرداد 1391, 21:14 عصر
اگر از سیستم کاربری خود asp.net استفاده می کنید نیازی به تعریف متغیر از طرف شما نیست . خود asp.net این امکان رو داره که پس از چند تلاش ناموفق ( تعدادش رو شما تعیین می کنید در web.config ) حساب کاربری رو قفل کنه و دیگه کاربر نمی تونه وارد سایت بشه .

اینکه کاربر فقط برای یک مدت زمان خاص حسابش قفل بشه و بعد از اون زمان حساب کاربریش باز بشه و بتونه لاگین بشه هم بدون استفاده از متغیر در سطح application ممکنه .

1- اول باید تنظیمات مربوط به قفل کردن حساب کاربری بعد از مثلا 3 تلاش ناموفق رو به تنظیمات membership توی web.config اضافه کنیم . باید مدت زمانی که این 3 تلاش ناموفق در اون باید اتفاق بیفتن تا حساب کاربری قفل بشه هم مشخص بشه مثلا 3 باز تلاش ناموفق در 5 دقیقه :



<membership defaultProvider="SqlProvider">
<providers>
<!-- Add the new SqlMembershipProvider-->
<add name="SqlProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="MyConnection" maxInvalidPasswordAttempts="3" passwordAttemptWindow="5" applicationName="/"/>
</providers>
</membership>


حالا هر کاربری که در یک زمان 5 دقیقه ای 3 بار رمز عبورش رو اشتباه وارد کنه حسابش قفل میشه . اما سیستم کاربری Asp.net خودش اتوماتیک حساب کاربری رو بعد از مدتی باز نمی کنه . پس باید برای این بخش کد بنویسیم .


برای اینکار از کنترل Login استفاده می کنیم . این کنترل یک رویداد داره به نام LoggingIn که بعد از کلیک کاربر روی کلید ورود و قبل از رویداد authenticate اتفاق می افته . توی این رویداد ما حساب کاربر رو چک می کنیم که اگر قفل بود و از زمان قفل شدنش بیش از یک مدت زمان معینی گذشته بود با استفاده از تابع UnlockUser حساب کاربری رو باز کنیم .



protected void Login1_LoggingIn(object sender, LoginCancelEventArgs e)
{
// گرفتن کاربر از دیتابیس
MembershipUser user = Membership.GetUser(Login1.UserName);
// اگر کاربری با این نام وجود داشت
if ( user != null)
{
//اگر کاربر قفل شده بود
if (user.IsLockedOut)
{
//تاریخ قفل شدن کاربر رو می گیریم
DateTime lastLockout = user.LastLockoutDate;
//محاسبه زمانی که باید کاربر قفل بماند
DateTime unlockDate = lastLockout.AddMinutes(5);

//بررسی اینکه آیا مدت زمان لازم طی شده یا نه
if (DateTime.Now > unlockDate)
// اگر طی شده بود کاربر رو باز می کنیم
user.UnlockUser();
}
}
}

hatefs
پنج شنبه 26 مرداد 1391, 23:26 عصر
از viewstate برای نگهداری متغیر استفاده کن و به ازای هر بار اشتباه در ورود یکی به متغیر بیافزا

oggiii
پنج شنبه 26 مرداد 1391, 23:34 عصر
اگر از سیستم کاربری خود asp.net استفاده می کنید نیازی به تعریف متغیر از طرف شما نیست . خود asp.net این امکان رو داره که پس از چند تلاش ناموفق ( تعدادش رو شما تعیین می کنید در web.config ) حساب کاربری رو قفل کنه و دیگه کاربر نمی تونه وارد سایت بشه .

اینکه کاربر فقط برای یک مدت زمان خاص حسابش قفل بشه و بعد از اون زمان حساب کاربریش باز بشه و بتونه لاگین بشه هم بدون استفاده از متغیر در سطح application ممکنه .

1- اول باید تنظیمات مربوط به قفل کردن حساب کاربری بعد از مثلا 3 تلاش ناموفق رو به تنظیمات membership توی web.config اضافه کنیم . باید مدت زمانی که این 3 تلاش ناموفق در اون باید اتفاق بیفتن تا حساب کاربری قفل بشه هم مشخص بشه مثلا 3 باز تلاش ناموفق در 5 دقیقه :



<membership defaultProvider="SqlProvider">
<providers>
<!-- Add the new SqlMembershipProvider-->
<add name="SqlProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="MyConnection" maxInvalidPasswordAttempts="3" passwordAttemptWindow="5" applicationName="/"/>
</providers>
</membership>


حالا هر کاربری که در یک زمان 5 دقیقه ای 3 بار رمز عبورش رو اشتباه وارد کنه حسابش قفل میشه . اما سیستم کاربری Asp.net خودش اتوماتیک حساب کاربری رو بعد از مدتی باز نمی کنه . پس باید برای این بخش کد بنویسیم .


برای اینکار از کنترل Login استفاده می کنیم . این کنترل یک رویداد داره به نام LoggingIn که بعد از کلیک کاربر روی کلید ورود و قبل از رویداد authenticate اتفاق می افته . توی این رویداد ما حساب کاربر رو چک می کنیم که اگر قفل بود و از زمان قفل شدنش بیش از یک مدت زمان معینی گذشته بود با استفاده از تابع UnlockUser حساب کاربری رو باز کنیم .



protected void Login1_LoggingIn(object sender, LoginCancelEventArgs e)
{
// گرفتن کاربر از دیتابیس
MembershipUser user = Membership.GetUser(Login1.UserName);
// اگر کاربری با این نام وجود داشت
if ( user != null)
{
//اگر کاربر قفل شده بود
if (user.IsLockedOut)
{
//تاریخ قفل شدن کاربر رو می گیریم
DateTime lastLockout = user.LastLockoutDate;
//محاسبه زمانی که باید کاربر قفل بماند
DateTime unlockDate = lastLockout.AddMinutes(5);

//بررسی اینکه آیا مدت زمان لازم طی شده یا نه
if (DateTime.Now > unlockDate)
// اگر طی شده بود کاربر رو باز می کنیم
user.UnlockUser();
}
}
}



سلام
می بخشید منم راجع به کدتون سئوال داشتم
کد شما برای زمانی هست که از کامپوننت لوگین استفاده کنیم
اگر ما خودمون لوگین رو ساخته باشیم چی ؟ یعنی 2 تا تکس باکس و یک باتوم گذاشته باشیم ؟
تشکر

dorparasti
جمعه 27 مرداد 1391, 00:02 صبح
فرقی نمی کنه . در اینصورت قبل از این که تابع membership.Validate رو فراخوانی کنید ، اول این کدها رو اجرا کنید تا اگر کاربر قفل بود ، باز بشه . بعد تابع Validate رو فراخوانی کنید

hamedd82
جمعه 27 مرداد 1391, 12:49 عصر
<membership defaultProvider="SqlProvider"> <providers> <!-- Add the new SqlMembershipProvider--> <add name="SqlProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="MyConnection" <b>maxInvalidPasswordAttempts="3" passwordAttemptWindow="5"</b> applicationName="/"/> </providers> </membership>oggiii (http://barnamenevis.org/member.php?125180-oggiii) ممنون که به سوال من جواب دادی ولی من با این کد در webconfig مشکل دارم بهم ارور میده
از تگ <b> ایراد میگیره

dorparasti
جمعه 27 مرداد 1391, 13:17 عصر
اون تگ <b> برای این بود که توی توضیحات اون بخش رو bold کنم که انگار درست کار نکرده متاسفانه . اون جز کد نیست . کل تگ های <b> رو پاک کن

hamedd82
جمعه 27 مرداد 1391, 15:08 عصر
درست شد فقط باز این خط ارور میده
MembershipUser user = Membership.GetUser(Login1.UserName); داخل پرانتز از login1 ایراد میگیره
فقط یه نکته ای بگم من از 2 تا تکست باکس و یه دکمه استفاده میکنم اگه مشکل اینجاست بگو چیکار کنم
ممنون

dorparasti
جمعه 27 مرداد 1391, 15:31 عصر
اون login1 اسم کنترل Login هستش اگه خودت textbox گذاشتی مقدار داخل تکست باکس مربوط به نام کاربری رو بزار اون تو

mehdi_gerami65
جمعه 27 مرداد 1391, 18:38 عصر
بابا روشي كه دوست عزيزمون بالا گفته روش خوبيه ولي وابسته به خود Asp.net ولي اگه كاربر خودش طراحي كنه تكليف چيه بايد يه جوري كنترل بشه يا نه روشي كه من بالا گفتم نوشتم وداره الان تو يه محيط واقعي اجرا ميشه

hamedd82
شنبه 28 مرداد 1391, 01:59 صبح
منم خودم طراحی کردم این کد جواب نمیده
لطفا یکی راهنمایی کنه

h_r_sh
شنبه 28 مرداد 1391, 02:54 صبح
منم خودم طراحی کردم این کد جواب نمیده
لطفا یکی راهنمایی کنه
یعنی شما اصلا از امکانات asp برای ثبت کاربرها استفاده نکردی؟

h_r_sh
شنبه 28 مرداد 1391, 03:00 صبح
با سلام شما بايد براي اين كار در قسمت لاگين يك Application["usercount "] تعريف كنيد هر بار كه كاربر لاگين ميكنه تعداد اونوبشمري برزيزي داخل اون بعد مقايسه كني اگه بيشتر از 3 بار شد ديگه نذاري كاربر لاگين كنه بعد ياد نره كه اونو خالي كني چون تا زمان از كار افتادن سايت رو حافظه ميمونه چون يه مرتبه از سي‍ن بالاتر است موفق باشي اگه باز مشكلي بود من در خدمت شما هستم
اگر یه کاربر n دفعه با username های مختلف و نامعتبر login کنه، شما چطوری تشخیص می دی کدوم کاربر باید قفل بشه؟

dorparasti
شنبه 28 مرداد 1391, 03:34 صبح
اگر یه کاربر n دفعه با username های مختلف و نامعتبر login کنه، شما چطوری تشخیص می دی کدوم کاربر باید قفل بشه؟


من هم همین نظر رو دارم . یعنی حتی اگر این مشکلات هم حل بشه . نیاز به کدنویسی زیاد و دقیقی داره . در حالی که با استفاده از ابزار های آماده asp.net میشه با کدنویسی کمتر و امن تری همین کار رو انجام داد .