PDA

View Full Version : سوال: پياده سازي maxInvalidPasswordAttempts چطوري ؟



احمد سامعی
جمعه 08 خرداد 1388, 12:09 عصر
سلام دوستان
من مي خوام از maxInvalidPasswordAttempts يا passwordAttemptThreshold استفاده كنم.
نحوه پياده سازي به چه صورت ؟ يعني وقتي يوزر يا پس اشتباه چطوري به صفحه خطا ارجاء بدم و تعداد دفعات خطا رو نشون بدم

در ضمن تفاوت استفاده از اين دو تا چي ؟

احمد سامعی
یک شنبه 10 خرداد 1388, 00:38 صبح
آقا يعني كسي نيست يك راهنمايي كوچك هم بكنه
يك اشاره اي چيزي !؟.......

احمد سامعی
یک شنبه 10 خرداد 1388, 19:33 عصر
اينكه نشد ديگه استفاده از maxInvalidPasswordAttempts ... دستي انجام دادن مال زماني كه كنترل Login خودت نوشتي
اما بيچاره ماكروسافت بيكار بوده اين همه زحمت كشيده اين كنترل هاي Loging ساخته و بانك و جدول هاي مربوطش واست مي سازه و از همه مهمتر جدول و فيلدهايي كه مقدار اين maxInvalidPasswordAttempts نگهداري مي كنه دست آخر يك خاصيت هم به web.config مي گه اضافه كن
تا آخرش با سنشن كار كني يا كنتر !!!! جداً راه حل خوبي هست :اشتباه::متفکر:

razavi_university
دوشنبه 11 خرداد 1388, 16:36 عصر
حال این یعنی چی ؟


یعنی :
یا خودتون کنترل واسه Login بسازید و مواردی که نیاز دارید را در آن قرار بدین و یا از کنترل Login ماکروسافت استفاده کنید.

اگر خودتون کنترل Login رو بسازید که خوب همه چی دست خودتونه و اگر هم از کنترل Login ماکروسافت استفاده کنین می تونین یه Membership Provider دلخواه بنویسید و در Webconfig معرفیش کنید و در آن Membershipسفارشی خودتون کارهای لازم را انجام بدین

احمد سامعی
دوشنبه 11 خرداد 1388, 21:25 عصر
یه Membership Provider دلخواه بنویسید و در Webconfig معرفیش کنید

بالاخره يكي پيدا شد بفهم من چي مي گم و چي مي خوام

ممنون جناب رضوي
من تا اينجا پيش رفتم كنترل Login ماكروسافت استفاده كردم و Membership Provider تو Wb.Config تعريف كردم اما مشكل دو تاست:
1. وقتي maxInvalidPasswordAttempts ست مي كنم صفحه مربوطه هنگام بارگذاري خطا مي ده تو همين خط
2. تازه حالا فرض كنيم اين مشكل حل شد چطوري از اين maxInvalidPasswordAttempts بايد استفاده كنم، يعني چطوري بعد از هر Login ناموفق به طرف بگم چندتا ورود اشتباه داشته و اكانت قفل شده و از اين حرفا....
كل روند پياده سازي اش را مي خوام يك مثالي چيزي...:تشویق::لبخند::خجالت:
ممنون

razavi_university
سه شنبه 12 خرداد 1388, 02:41 صبح
در مورد سوال اولتون نمیدونم چرا خطا میده و باید دید که شما چی نوشتید و اون چی میگه

در مورد سوال دوم : زمانی که شما یک کلاس Membership دلخواه می نویسید، ریز تمام کارهای که برای Login و LogOut و ... انجام می شود در اختیار شماست، یه خط در متد مربوطه اضافه کنید(الان اسم متدش یادم نیست) و کاربر را به صفحه خطا Redirect کنید و تعداد دفعات ورود اشتباه را هم بهش نشون بدین
(ممکن است راه دیگری شاید ساده تر داشته باشد ولی من بلد نیستم)

موفق باشید
مشکل دیگری بود در خدمتم

احمد سامعی
سه شنبه 12 خرداد 1388, 23:56 عصر
در مورد سوال دوم : زمانی که شما یک کلاس Membership دلخواه می نویسید، ریز تمام کارهای که برای Login و LogOut و ... انجام می شود در اختیار شماست،

من كلاس واسه Membership ننوشتم البته يك فيلم واسه اينكار از سايت asp.net گرفتم اما الان فقط تو Wb.Config يك Membership Provider تعريف كردم و كانكشن استرينگ تعريف كردم ولي بقيه كارها رو خود كنترل Login hk[hl مي ده
حالا چي كار كنم آيا بايد كلاس ويژه بنويسم خودم ؟
يا نه از همين راهي كه الان رفتم هم مي شه كاري كرد ؟

razavi_university
چهارشنبه 13 خرداد 1388, 01:50 صبح
زمانی که از حالت پیشفرض استفاده کنید یک دیتابیس برای کارهای Login و ... به پروژه شما اضافه می شود و مواردی که لازم است به Webconfig افزوده می شود،
اما شما می توانید کلاسی پیش فرض را Override کرده و یک کلاس بنویسید سپس انرا به webconfig اضافه کنید
مزایا و معایب استفاده از کلاس پیشفرض که قبلا در یکی از تاپیک ها بحث شد:


ز مهمترین معایبش که من باهاش برخورد داشتم یکی همین دیتابیس جدا و فیلدهایی که شاید مورد نیاز ما نباشد دارد و فیلدهایی که گاها در مواردی خاص نیاز داریم را ندارد

البته من از همون لوگین پیش فرض استفاده می کنم و از همان توابع و امکاناتی که ASP در اختیارتان می گذارد با این تفاوت که Provider سفارشی خودم را برای احراز هویت کاربران نوشته ام و به صورت یک کلاس برای Override کردن کلاس اصلی استفاده می کنم.
در این حالت نیازی نیست که کنترل جداگانه واسه ورود و خروج بنویسم و به صورت دستی Session و کوکی برای احراز هویت اضافه کنم، صرفا در Config مشخص می کنم که از Custom Membership Provider استفاده می کنم
و مزیت دیگرش اینه که از همون دیتابیس اصلی سایت که سایر موارد در اون هست استفاده می کنم و به راحتی جدول کاربران تمام فیلدهاش بسته به نیاز من تغییر می کنند


برای مطالعه بیشتر:
Implementing a Membership Provider (http://msdn.microsoft.com/en-us/library/f1kyba5e.aspx)
Sample Membership Provider Implementation (http://msdn.microsoft.com/en-us/library/44w5aswa%28VS.85%29.aspx)
How to: Sample Membership Provider Implementation (http://msdn.microsoft.com/en-us/library/6tc47t75%28VS.85%29.aspx)

مثال بالا در رابطه با نوشتن یک Custom Membership Provider برای دیتابیس ODBC است(دیتابیس Access)، از تکنیک Copy & Paste استفاده کرده سپس دستورات آنرا بنا به نوع دیتابیس خود آنرا تغییر دهید

razavi_university
چهارشنبه 13 خرداد 1388, 01:53 صبح
به عنوان مثال این تابع بهنگام سازی مقدار دفعات ورود اشتباه است


private void UpdateFailureCount(string username, string failureType)
{
SqlConnection conn = new SqlConnection(connectionString);
SqlCommand cmd = new SqlCommand("SELECT FailedPasswordAttemptCount, " +
" FailedPasswordAttemptWindowStart, " +
" FailedPasswordAnswerAttemptCount, " +
" FailedPasswordAnswerAttemptWindowStart " +
" FROM dbo.[User] " +
" WHERE usrname = @Username AND ApplicationName = @ApplicationName", conn);

cmd.Parameters.Add("@Username", username.ToLower().Trim());
cmd.Parameters.Add("@ApplicationName", pApplicationName);

SqlDataReader reader = null;
DateTime windowStart = new DateTime();
int failureCount = 0;

try
{
conn.Open();

reader = cmd.ExecuteReader(CommandBehavior.SingleRow);

if ( reader.HasRows )
{
reader.Read();

if ( failureType == "password" )
{
failureCount = reader.GetInt32(0);
windowStart = reader.GetDateTime(1);
}

if ( failureType == "passwordAnswer" )
{
failureCount = reader.GetInt32(2);
windowStart = reader.GetDateTime(3);
}
}

reader.Close();

DateTime windowEnd = windowStart.AddMinutes(PasswordAttemptWindow);

if ( failureCount == 0 || DateTime.Now > windowEnd )
{
// First password failure or outside of PasswordAttemptWindow.
// Start a new password failure count from 1 and a new window starting now.

if ( failureType == "password" )
cmd.CommandText = "UPDATE dbo.[User] " +
" SET FailedPasswordAttemptCount = @Count, " +
" FailedPasswordAttemptWindowStart = @WindowStart " +
" WHERE usrname = @Username AND ApplicationName = @ApplicationName";

if ( failureType == "passwordAnswer" )
cmd.CommandText = "UPDATE dbo.[User] " +
" SET FailedPasswordAnswerAttemptCount = @Count, " +
" FailedPasswordAnswerAttemptWindowStart = @WindowStart " +
" WHERE usrname = @Username AND ApplicationName = @ApplicationName";

cmd.Parameters.Clear();

cmd.Parameters.Add("@Count", 1);
cmd.Parameters.Add("@WindowStart", DateTime.Now);
cmd.Parameters.Add("@Username", username.ToLower().Trim());
cmd.Parameters.Add("@ApplicationName", pApplicationName);

if ( cmd.ExecuteNonQuery() < 0 )
throw new ProviderException("Unable to update failure count and window start.");
}
else
{
if ( failureCount++ >= MaxInvalidPasswordAttempts )
{
// Password attempts have exceeded the failure threshold. Lock out
// the user.

cmd.CommandText = "UPDATE dbo.[User] " +
" SET IsLockedOut = @IsLockedOut, LastLockedOutDate = @LastLockedOutDate " +
" WHERE usrname = @Username AND ApplicationName = @ApplicationName";

cmd.Parameters.Clear();

cmd.Parameters.Add("@IsLockedOut", true);
cmd.Parameters.Add("@LastLockedOutDate", DateTime.Now);
cmd.Parameters.Add("@Username", username.ToLower().Trim());
cmd.Parameters.Add("@ApplicationName", pApplicationName);

if ( cmd.ExecuteNonQuery() < 0 )
throw new ProviderException("Unable to lock out user.");
}
else
{
// Password attempts have not exceeded the failure threshold. Update
// the failure counts. Leave the window the same.

if ( failureType == "password" )
cmd.CommandText = "UPDATE dbo.[User] " +
" SET FailedPasswordAttemptCount = @Count" +
" WHERE usrname = @Username AND ApplicationName = @ApplicationName";

if ( failureType == "passwordAnswer" )
cmd.CommandText = "UPDATE dbo.[User] " +
" SET FailedPasswordAnswerAttemptCount = @Count" +
" WHERE usrname = @Username AND ApplicationName = @ApplicationName";

cmd.Parameters.Clear();

cmd.Parameters.Add("@Count", failureCount);
cmd.Parameters.Add("@Username", username.ToLower().Trim());
cmd.Parameters.Add("@ApplicationName", pApplicationName);

if ( cmd.ExecuteNonQuery() < 0 )
throw new ProviderException("Unable to update failure count.");
}
}
}
catch ( SqlException e )
{
if ( WriteExceptionsToEventLog )
{
WriteToEventLog(e, "UpdateFailureCount");

throw new ProviderException(exceptionMessage);
}
else
{
throw e;
}
}
finally
{
if ( reader != null )
{
reader.Close();
}
conn.Close();
}
}