آموزش ASP.NET

آموزش ASP.NET متفاوت از آنچه جاهای دیگر می بینید!

آموزش ASP.NET

آموزش ASP.NET متفاوت از آنچه جاهای دیگر می بینید!

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

وقتی که یک کاربر وارد صفحه ورود می شود و اعتبارنامه خود را وارد می کند، مرورگر یک درخواست HTTP برای صفحه ورود ایجاد می کند. اگر اعتبارنامه معتبر باشد، HTTP در پاسخ یک بلیط اعتبارسنجی داخل یک کوکی ارسال می کند. بنابراین، یک هکر که تلاش می کند وارد سایت شما شود، می تواند یک برنامه ایجاد کند که یک درخواست HTTP همراه با یک نام کاربری معتبر به صفحه ورود ارسال کرده و گذرواژه را حدس بزند. اگر گذرواژه حدسی صحیح باشد، صفحه ورود یک کوکی بلیط اعتبارسنجی برمی گرداند.

برای جلوگیری از این حملات (که در آن یک نام کاربری با تعداد زیادی گذرواژه تست می شوند) بستر عضویت کاربری که تعداد مشخصی ورود ناموفق داشته باشد را قفل می کند. بدین منظور دو پارامتر زیر در تنظیمات پیکربندی بستر عضویت وجود دارند:

·         maxInvalidPasswordAttempts: تعداد مرتبه وارد کردن گذرواژه نامعتبر برای یک کاربر را مشخص می کند. اگر از این تعداد بیشتر شود، کاربر قفل می گردد. مقدار پیش فرض این پارامتر 5 است.

·         passwordAttemptWinddows: بازه زمانی (دقیقه) را مشخص می کند که در خلال آن  چند بار کاربر می تواند ورود ناموفق داشته باشد. مقدار پیش فرض آن 10 است.

اگر یک کاربر قفل گردد، تا زمانی که مدیر آن را باز نکند، نمی تواند وارد سایت شود. وقتی که یک کاربر قفل گردیده است، متد ValidateUser همیشه مقدار false را برمی گرداند.

متاسفانه، ابزار داخلی برای باز کردن کاربر وجود ندارد. برای باز کردن یک حساب، می توانید مستقیم وارد پایگاه داده شده و فیلد IsLockedOut در جدول aspnet_Membership را تغییر دهید و یا با ایجاد یک رابط کاربری که حساب های قفل شده را نمایش دهد و امکان باز کردن آنها را داشته باشد، این کار انجام دهید. در مباحث آینده یک رابط کاربری برای مدیریت ایجاد می کنیم که بتوان کاربرها و نقش ها را مدیریت کرد.

اعتبارسنجی کاربر با استفاده از محل نگهداری عضویت کاربر

گام اول: اعتبارسنجی کاربر با استفاده از محل نگهداری عضویت کاربر

برای وب سایت هایی که از اعتبارسنجی فرم ها استفاده می کنند، یک کاربر با وارد کردن نام کاربری و گذرواژه در صفحه ورود، وارد سایت می شود. سپس این اعتبارنامه ها با محل نگهداری کاربران مقایسه می شوند. اگر آنها معتبر بودند، کاربر یک بلیط اعتبارسنجی فرم ها به دست می آورد.

برای اعتبارسنجی یک کاربر با استفاده از بستر عضویت، از متد ValidateUser کلاس Membership استفاده می شود. متد ValidateUser دو پارامتر (نام کاربری و گذرواژه) می گیرد و یک مقدار بولی برمی گرداند که مشخص کننده اعتبار کاربر می باشد.

 SqlMembershipProvider اعتبارنامه وارد شده را بوسیله به دست آوردن گذرواژه کاربر وارد شده از طریق رویه ذخیره شده (stored procedure) aspnet_Membership_GetPasswordWithFormat اعتبارسنجی می کند. یادآوری می گردد که SqlMembershipProvider گذرواژه ها را در سه فرمت: encrypted, clear و یا hashed نگهداری می کند. رویه ذخیره شده aspnet_Membership_GetPasswordWithFormat گذرواژه را همراه با فرمت ذخیره شده برمی گرداند. برای گذرواژه هایی که encrypt و یا hash شده اند، SqlMembershipProvider گذرواژه ای که به متد ValidateUser پاس داده می شود را به صورت معادل encrypt و یا hash آن انتقال داده و با چیزی که از پایگاه داده برگشت داده شده است، مقایسه می کند. اگر گذرواژه ذخیره شده در پایگاه داده با گذرواژه وارد شده در فرمت مشخص شده یکسان باشند، اعتبارنامه معتبر است.

حالا صفحه ورود را به روز می کنیم.

  

 

 

این صفحه می تواند بدون دست خوردن باقی بماند، اما باید کدهای مربوط به رویداد کلیک دکمه Login جهت استفاده از محل نگهداری کاربران بستر عضویت تغییر پیدا کند. کدهای رویداد کلیک را به صورت زیر تغییر دهید:

protected void LoginButton_Click(object sender, EventArgs e)

{

// Validate the user against the Membership framework user store

if (Membership.ValidateUser(UserName.Text, Password.Text))

{

// Log the user into the site

FormsAuthentication.RedirectFromLoginPage(UserName.Text, RememberMe.Checked);

}

// If we reach here, the user's credentials were invalid

InvalidCredentialsMessage.Visible = true;

}

این کدها به طور قابل ملاحظه ای ساده هستند. با فراخوانی متد Membership.ValidatUser و پاس دادن نام کاربری و گذرواژه وارد شده به آن شروع می کنیم. اگر اعتبارنامه معتبر نباشد، برچسب InvalidCredentialMessge نمایش داده می شود، به این وسیله به کاربر اطلاع داده می شود که کاربر و یا گذرواژه وارد شده صحیح نیست.

توسعه دادن رفتار کنترل CreateUserWizard با استفاده از رویدادها

کنترل CreateUserWizard از تعدادی رویداد تشکیل شده است. برای مثال؛ هنگام که بازدید کننده نام کاربری، گذرواژه و دیگر اطلاعات لازم را وارد کرد و بر روی دکمه Create User کلیک کند، کنترل CreateUserWizard رویداد CreatingUser را وادار عمل می‌کند. اگر در پروسه ایجاد کاربر اشکالی به وجود آید CreateUserError به کار گرفته می‌شود؛ همچنین اگر کاربر با موفقیت ایجاد شود رویداد CreatedUser اجرایی می‌شود.

در بعضی مواقع ممکن است ما بخواهیم در گردش کار کنترل CreateUserWizard دستکاری کنیم. برای روشن شدن این موضوع؛ اجازه دهید RegisterUser را با وارد کردن تعدادی اعتبار سنجی، توسعه دهیم. در این حالت اجازه ندهیم که نام کاربری شامل فضای خالی (space)؛ قبل و بعد و بین حروف؛ باشد. همچنین نام کاربری به هیچ عنوان در گذرواژه استفاده نشود.

برای انجام این کار باید یک عملیات رویداد برای رویداد CreatingUser ایجاد کنیم. اگر اطلاعات وارد شده معتبر نباشند، ایجاد کاربر باید منتفی شود. همچنین باید یک کنترل Label به صفحه اضافه کنیم تا پیام مربوط به نامعتبر بودن نام کاربری و یا گذرواژه را نمایش دهیم. با اضافه کردن یک کنترل Label در پایین کنترل CreateUserWizard کار را شروع می‌کنیم. ID آن را برابر InvalidUserNameOrPasswordMessage و ForeColor را برابر Red قرار می‌دهیم. متن Text آن را پاک کرده و مشخصه‌های EnableViewState و Visible آن را false می‌کنیم.  

<asp:Label runat="server" id="InvalidUserNameOrPasswordMessage"

Visible="false" ForeColor="Red"

EnableViewState="false">

</asp:Label> 

سپس کنترل CreateUserWizard را انتخاب کرده و در بالای پنجره Properties روی آیکن Events کلیک کنید تا رویدادها نمایش داده شوند. بروی رویداد CreatingUser دوبار کلیک کنید و کدهای زیر را وارد کنید: 

protected void RegisterUser_CreatingUser(object sender, LoginCancelEventArgs e)

{

string trimmedUserName = RegisterUser.UserName.Trim();

if (RegisterUser.UserName.Length != trimmedUserName.Length)

{

// Show the error message

InvalidUserNameOrPasswordMessage.Text = "The username cannot contain leading or trailing spaces.";

InvalidUserNameOrPasswordMessage.Visible = true;

// Cancel the create user workflow

e.Cancel = true;

}

else

{

// Username is valid, make sure that the password does not contain the username

if (RegisterUser.Password.IndexOf(RegisterUser.UserName, StringComparison.OrdinalIgnoreCase) >= 0)

{

// Show the error message

InvalidUserNameOrPasswordMessage.Text = "The username may not appear anywhere in the password.";

InvalidUserNameOrPasswordMessage.Visible = true;


// Cancel the create user workflow

e.Cancel = true;

}

}