ما برای اینکه بتوانیم تعیین کنیم که نام کاربری و رمز عبور درست است نیاز داریم که اعتبارنامههای کاربران در محلی ذخیره شود تا بتوانیم نام کاربری و رمز عبور را با آنها مقایسه کنیم.
تا قبل ازASP.NET 2.0 ، توسعه دهندگان مجبور بودند خودشان محلی برای نگهداری اعتبارنامههای کاربران ایجاد کنند و کدهایی بنویسند که اعتبار نام کاربری و رمز عبور وارد شده را تعیین کند. بیشتر توسعهدهندگان اطلاعات کاربران را در یک پایگاه داده شامل یک جدول با نام Users با ستونهایی مانند UserName, Password, Email, LastLoginDate و از این دست، میساختند. این جدول برای هر کاربر یک رکورد داشت. نام کاربر و رمز عبور وارد شده در قالب یک پرس و جو[1] از پایگاه داده چک میشد، به این صورت که نام کاربر در دادهها وجود داشته باشد و سپس رمز عبور آن نیز صحیح باشد. باASP.NET 2.0 توسعه دهندگان باید یکی از تهیه کنندگان عضویت را برای ذخیره کاربران استفاده کنند. در حال حاضر با فراخوانی کلاس عضویت[2] و متد تایید اعتبار کاربر[3] به سادگی اعتبارنامه کاربر را تعیین اعتبار میکنیم. متد تایید اعتبار کاربر، یک مقدار بولی که تعیین کننده درستی اعتبار نام کاربر و رمز عبور است را برمیگرداند.
در حال حاضر به وسیله کدهای داخل خود صفحه ورود احراز هویت را انجام میدهیم. کدهای زیر در رویداد کلیک دکمه تایید نوشته شوند:
protected void LoginButton_Click(object sender, EventArgs e)
{
// Three valid username/password pairs: Scott/password, Jisun/password, and Sam/password.
string[] users = { "Scott", "Jisun", "Sam" };
string[] passwords = { "password", "password", "password" };
for (int i = 0; i < users.Length; i++)
{
bool validUsername = (string.Compare(UserName.Text, users[i], true) == 0);
bool validPassword = (string.Compare(Password.Text, passwords[i], false) == 0);
if (validUsername && validPassword)
{
// TODO: Log in the user...
// TODO: Redirect them to the appropriate page
}
}
// If we reach here, the user's credentials were invalid
InvalidCredentialsMessage.Visible = true;
}
همانگونه که میبینید سه حساب کاربری معتبر وجود دارد: Scott, Jisum و Sam و رمز عبور همه آنها password است. برنامه در داخل یک حلقه، درون آرایههای users و passwords را جهت مطابقت نام کاربر و رمز عبور معتبر میکاود. اگر نام کاربر و رمز عبور معتبر بود، ما باید کاربر را وارد و سپس به صفحه مورد نظر هدایت کنیم. اگر اعتبارنامه نامعتبر بود، برچسب InvalidCredentialsMessage را نمایش میدهیم.
اشاره کردم که وقتی کاربر اعتبارنامه معتبر وارد میکند به صفحه مناسب هدایت میشود. فکر میکنید صفحه مناسب چیست؟ به یاد دارید که، وقتی که کاربر میخواهد صفحهای که برای دیدن آن مجوزدهی نشده است را ببیند، FormsAuthenticationModule به طور خودکار او را به صفحه ورود هدایت میکند. هنگام انجام این کار، FormsAuthenticationModule نشانی مورد درخواست را در رشته پرس و جو از طریق پارامتر ReturnUrl نگهداری میکند. به این معنی که اگر کاربر بخواهد صفحه ProtectedPage.aspx را که برای آن مجوزدهی نشده است را ببیند، FormsAuthenticationModule او را به نشانی زیر هدایت میکند:
Login.aspx?ReturnUrl=ProtectedPage.aspx
به محض ورود موفقیت آمیز، کابر باید به ProtectedPage.aspx هدایت شود. ممکن است کاربر به خواست خود بخواهد اول صفحه ورود را ببیند، در این صورت بعد از ورود، کاربر باید به شاخه ریشه، صفحه Default.aspx، فرستاده شود.
[1] Query
[2] Membership class
[3] ValidateUser method
به منظور پشتیبانی از احراز هویت فرمها سایت ما به صفحه ورود نیاز دارد. پیش از این گفته شد اگر کاربر بخواهد صفحهای که مجوز دیدن آن را ندارد، ببیند، FormsAuthenticationModule به طور خودکار او را به صفحه ورود هدایت میکند. همچنین، کنترلهایASP.NET وجود دارند که یک پیوند به صفحه ورود برای کاربران ناشناس نشان میدهند. حالا پرسش این است، نام و آدرس صفحه ورود چه باید باشد؟
به طور پیش فرض، سامانه احراز هویت فرمها صفحه ورود را در شاخه ریشه و با نام Login.aspx در نظر میگیرد. اگر شما میخواهید از یک نام و آدرس متفاوت دیگر برای صفحه ورود استفاده کنید، میتوانید آن را در Web.config تعیین کنید.
صفحه ورود سه کار انجام را میدهد:
1- ایجاد یک رابط کاربری که به کاربر اجازه میدهد اعتبارنامهاش (نام کاربری و رمز عبور) را وارد کند.
2- تعیین کند که آیا اعتبارنامه کاربر معتبر است.
3- با ایجاد برچسب احراز هویت فرمها، کاربر را وارد سایت کند.
ایجاد رابط کاربری صفحه ورود
یک صفحه جدیدASP.NET با نام Login.aspx ایجاد و صفحه Site.master را به آن اعمال کنید.
معمولا رابط کاربری صفحه ورود شامل دو جعبه متنی[1]، یکی برای نام کاربری و دیگری برای رمز عبور، و یک دکمه[2] برای تایید کردن است. وب سایتها در بیشتر مواد یک CheckBox با عنوان «مرا به خاطر بسپار» دارند که اگر تیک خورده باشد در اجرا شدن بعدی مرورگر برچسب احراز هویت وجود خواهد داشت.
در این زمان صفحه خود را مطابق کدهای زیر طراحی میکنیم:
<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Login.aspx.cs" Inherits="Login" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server">
<h1>Login</h1>
<p>Username: <asp:TextBox ID="UserName" runat="server"></asp:TextBox></p>
<p>Password: <asp:TextBox ID="Password" runat="server"TextMode="Password">
</asp:TextBox></p>
<p><asp:CheckBox ID="RememberMe" runat="server" Text="Remember Me"/> </p>
<p><asp:Button ID="LoginButton" runat="server" Text="Login" OnClick="LoginButton_Click" /> </p>
<p><asp:Label ID="InvalidCredentialsMessage" runat="server" ForeColor="Red" Text="Your username or password is invalid. Please try again." Visible="False"></asp:Label> </p>
</asp:Content>
مرحله دوم بعد از ساخت وب سایت فعال ساختن احراز هویت فرمها است. پیکربندی احراز هویت برنامه در عنصر <authentication> در Web.config انجام میشود. عنصر <authentication> یک مشخه به نام mode دارد که مدل احراز هویت که برنامه از آن استفاده میکند را تعیین میکند. این عنصر یکی از چهار مقدار زیر را میتواند داشته باشد:
به طور پیش فرض، برنامهASP.NET احراز هویت Windows را استفاده میکند. برای تغییر نوع احراز هویت به احراز هویت فرمها، باید مشخه mode عنصر <authentication> را به Forms تغییر دهیم.
اگر فایل Web.config در پروژه شما وجود ندارد، آن را اضافه کنید.
سپس عنصر <authentication> را در جای معین قرار دهید و مقدار mode آن را برابر Forms نمایید.
<configuration>
<system.web>
... Unrelated configuration settings and comments removed for brevity ...
<!--
The <authentication> section enables configuration
of the security authentication mode used by
ASP.NET to identify an incoming user.
-->
<authentication mode="Forms" />
</system.web>
</configuration>
نکته: از آنجایی که Web.config یک فایل XML است، کوچک و بزرگی حروف مهم است.
عنصر <authentication> میتواند به طور اختیاری یک عنصر فرزند به نام <forms> داشته باشد که شامل تنظیمات احراز هویت فرمها است.