گام اول: اعتبارسنجی کاربر با استفاده از محل نگهداری عضویت کاربر
برای وب سایت هایی که از اعتبارسنجی فرم ها استفاده می کنند، یک کاربر با وارد کردن نام کاربری و گذرواژه در صفحه ورود، وارد سایت می شود. سپس این اعتبارنامه ها با محل نگهداری کاربران مقایسه می شوند. اگر آنها معتبر بودند، کاربر یک بلیط اعتبارسنجی فرم ها به دست می آورد.
برای اعتبارسنجی یک کاربر با استفاده از بستر عضویت، از متد 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 از تعدادی رویداد تشکیل شده است. برای مثال؛ هنگام که بازدید کننده نام کاربری، گذرواژه و دیگر اطلاعات لازم را وارد کرد و بر روی دکمه 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;
}
}
}
با استفاده از روشهای گوناگون میتوان CreateUserWizard را سفارشی نمود؛ از طریق مشخصات آن، کاستن و یا افزودن مرحله و رویدادهای آن. در این بخش میبینیم که چگونه ظاهر کنترل را از طریق مشخصات آن سفارشی کنیم؛ و در ادامه سفارشی ساختن رفتار کنترل از طریق رویدادهای آن را فرا میگیریم.
تمام متنهایی که به طور پیش فرض در کنترل CreateUserWizard نمایش داده میشوند از طریق مشخصات کنترل قابل تغییر هستند. برای مثال؛ متن برچسبهای User Name, Password, Confirm Password, E-mail, Security Question و Security Answer که در کنار جعبههای متن نمایش داده میشوند را میتوان با استفاده از مشخصههای UserNameLabelText, PasswordLabelText, ConfirmPasswordLabelText, EmailLabelText, QestionLabelText و AnswerLabelText سفارشی ساخت. همچنین مشخصههایی برای تعیین متن دکمههای Create User و Continue در CreateUserWizardStep و CompleteWizardStep وجود دارند.
علاوه بر مشخصههایی که مربوط به ظاهر هستند، بعضی از مشخصهها بر رفتار کنترل اثر میگذارند. مشخصه DisplayCancelButton از آن نوع است. اگر این مشخصه با مقدار true برابر شده باشد، در کنار دکمه Create User یک دکمه دیگر با متن Cancel نمایش داده میشود. اگر این مشخصه برابر true شد برای مشخصه CancelDestinationPageUrl باید نشانی یک صفحه مشخص کرد تا هنگام کلیک دکمه Cancel توسط کاربر، کاربر به آن صفحه هدایت شود. همانگونه که پیشتر گفته شد، با کلیک روی دکمه Continue در مرحله پایانی فقط یک Postback انجام میشود و کاربر در همان صفحه میماند. برای هدایت کاربر به صفحه دیگر بعد از کلیک دکمه Continue باید مشخصه ContinueDestinationPageUrl را با نشانی یک صفحه مقداردهی کنیم.
حالا در صفحه RegisterUser کنترل CreateUserWizard را طوری تغییر میدهیم که دکمه Cancel را نمایش داده و هنگام کلیک این دکمه و دکمه Continue کاربر به صفحه Default.aspx هدایت شود. برای انجام این کار مقدار مشخصه DisplayCancelButton را برابر True قرارداده و CancelDestinationPageUrl و ContinueDestinationPageUrl را برابر “~/Default.aspx” قرار دهید.
هنگامی که یک بازدید کننده نام کاربری، گذرواژه، رایانامه، پرسش امنیتی و پاسخ آن را وارد کرده و بر روی دکمه Create User کلیک میکند، یک کاربر جدید ایجاد شده و همزمان آن کاربر login میشود. شاید این امر از نظر کاربر بسیار خوب باشد که همزمان با ثبت نام، نام کاربری آن نیز فعال گشته و داخل سایت شود. اما، شاید از نظر شما بهتر باشد که بازدید کننده پس از ثبت نام login نشود. بدین منظور مشخصه LoginCreateUser را برابر false قرار دهید.
حساب کاربری در بستر عضویت شامل یک پرچم تایید (approved) است؛ کاربری که تایید نشده باشد نمیتواند داخل سایت شود (login کند). به طور پیش فرض، حساب کاربری جدید که ایجاد میشود، تایید نیز میگردد و کاربر میتواند همان لحظه وارد سایت شود. این امکان وجود دارد که کاربر جدید ایجاد شده تایید نشده (unapproved) باشد. شاید شما بخواهید کاربر جدید توسط مدیر سایت تایید شود؛ و یا ممکن است بخواهید قبل از اجازه ورود به کاربر جدید درستی رایانامه وارد شده را بسنجید. برای این کار بهتر است کاربر جدید هنگام ثبت نام تایید نشود؛ بدین منظور مشخصه DisableCreateUser را برابر true قرار دهید.
دو مشخصه دیگر که رفتاری هستند عبارتند از: AutoGeneratePassword و MailDefinition. اگر مشخصه AutoGeneratePassword برابر true قرار داده شود، جعبه متنهای گذرواژه و تکرار گذرواژه نمایش داده نمیشوند، به جای آن با استفاده از متد GeneratePassword در کلاس Membership به طور خودکار گذرواژه تولید میگردد. متد GeneratePassword یک گذرواژه بر اساس ساختار پیکربندی شده؛ کمترین تعداد حروف، کمترین تعداد حروف غیر الفبایی؛ تولید میکند.
مشخصه MailDefinition برای فرستادن رایانامه به نشانی وارد شده هنگام ثبت نام، بسیار کاربردی است. مشخصه MailDefinition دارای زیرمشخصههایی برای انجام تنظیمات فرستادن رایانامه میباشد. این زیرمشخصهها شامل: Subject, Priority, IsBodyHtml, From, CC و BodyFileName میباشد. مشخصه BodyFileName به یک فایل متنی و یا HTML اشاره میکند که متن رایانامه در آن قرار دارد. بدنه رایانامه دو placeholder (متاسفانه ترجمهای برای این به فکرم نرسید) را پشتیبانی میکند: <%UserName%> و <%Password%>. این دو با مقادیر وارد شده توسط بازدید کننده هنگام ایجاد کاربر جدید جایگزین میشوند.