تا اینجا نام شرکت و عنوان هر کاربر هنگام ورود در مشخصه UserData در برچسب احراز هویت فرمها ذخیره شده است. این اطلاعات بدون رجوع به مخزن نگهداری کاربران در تمام صفحات از طریق برچسب احراز هویت فرمها قابل دسترسی هستند. برای نشان دادن اینکه چگونه می توان اطلاعات را از UserData بازیابی کرد، صفحه Default.aspx را با نوشتن نام کاربر به همراه شرکت و عنوان او به هنگام میکنیم.
protected void Page_Load(object sender, EventArgs e)
{
if (Request.IsAuthenticated)
{
WelcomeBackMessage.Text = "Welcome back, " + User.Identity.Name + "!";
// Get User Data from FormsAuthenticationTicket and show it in WelcomeBackMessage
FormsIdentity ident = User.Identity as FormsIdentity;
if (ident != null)
{
FormsAuthenticationTicket ticket = ident.Ticket;
string userDataString = ticket.UserData;
// Split on the |
string[] userDataPieces = userDataString.Split("|".ToCharArray()); string companyName = userDataPieces[0];
string titleAtCompany = userDataPieces[1]; WelcomeBackMessage.Text += string.Format(" You are the {0} of {1}.", titleAtCompany, companyName);
}
AuthenticatedMessagePanel.Visible = true;
AnonymousMessagePanel.Visible = false;
}
else
{
AuthenticatedMessagePanel.Visible = false;
AnonymousMessagePanel.Visible = true;
}
}
اگر Request.IsAuthenticated برابر true باشد، مشخصه Text کنترل WelcomeBackMessage ابتدا مقدار “Welcome back, username.” را میگیرد. سپس مشخصه User.Identity داخل شی FormsIdentity ریخته شده و میتوانیم از طریق FormsAuthenticationTicket دسترسی داشته باشیم. با داشتن FormsAuthenticationTicket مشخصه UserData را به نام شرکت و عنوان جداسازی میکنیم. این کار با جداسازی برمبنای کاراکتر میله “|”، امکانپذیر است.
متاسفانه، اضافه کردن اطلاعات مشخصات کاربر در یک برچسب احراز هویت فرمها به آن سادگی که انتظار داشتید، نیست. مشخصه UserData از کلاس FormsAuthenticationTicket فقط خواندنی است و تنها از طریق سازنده کلاس FormsAuthenticationTicket مقدار دهی میشود. هنگام تهیه مشخصه UserData در سازنده، ما نیز نیاز داریم مقادیر دیگر برچسب را تهیه کنیم: نام کاربر، تاریخ ورود، زمان انقضاء و غیره.
در صفحه ورود رویداد کلیک LoginButton را به وسیله کدهای زیر تغییر دهید:
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" };
string[] companyName = { "Northwind Traders", "Adventure Works", "Contoso" };
string[] titleAtCompany = { "Janitor", "Scientist", "Mascot" };
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)
{
// Query the user store to get this user's User Data
string userDataString = string.Concat(companyName[i], "|", titleAtCompany[i]);
// Create the cookie that contains the forms authentication ticket
HttpCookie authCookie = FormsAuthentication.GetAuthCookie(UserName.Text, RememberMe.Checked);
// Get the FormsAuthenticationTicket out of the encrypted cookie
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(authCookie.Value);
// Create a new FormsAuthenticationTicket that includes our custom User Data
FormsAuthenticationTicket newTicket = new FormsAuthenticationTicket(ticket.Version, ticket.Name, ticket.IssueDate, ticket.Expiration, ticket.IsPersistent, userDataString);
// Update the authCookie's Value to use the encrypted version of newTicket
authCookie.Value = FormsAuthentication.Encrypt(newTicket);
// Manually add the authCookie to the Cookies collection
Response.Cookies.Add(authCookie);
// Determine redirect URL and send user there
string redirUrl = FormsAuthentication.GetRedirectUrl(UserName.Text, RememberMe.Checked);
Response.Redirect(redirUrl);
}
}
// If we reach here, the user's credentials were invalid
InvalidCredentialsMessage.Visible = true;
}
متد، با تعریف چهار آرایه رشتهای شروع شده است: users, passwords, companyName, titleAtCompany. در برنامههای اصلی، مقادیر بالا نباید به صورت کد در داخل صفحه نوشته شود بلکه باید در مخزن نگهداری کاربران ذخیره شود.
در بخشهای قبلی سه مرحله زیر را انجام میدادیم:
1- برچسب احراز هویت فرمها ایجاد میشود.
2- برچسب را در یک مخزن مناسب نگاشته میشود. در برچسب احراز هویت بر پایه کوکی، در مجموعه کوکیها، و در برچسب احراز هویت بدون کوکی در URL.
3- کاربر به صفحه مناسب هدایت میشود.
این سه مرحله در کدهای بالا نیز مراعات شده است. ابتدا، رشتهای که در پایان در UserData ذخیره شده از ترکیب نام شرکت و عنوان کاربر به وجود آمده که این دو به وسیله کاراکتر میله “|” از هم جدا شدهاند.
string userDataString = string.Concat(companyName[i], "|", titleAtCompany[i]);
سپس، متد FormsAuthentication.GetAuthCookie جهت ایجاد برچسب احراز هویت، رمزنگاری و تعیین اعتبار آن مطابق با تنظیمات پیکربندی و قراردادن آن در یک شی از HttpCookie فراخوانی شده است.
HttpCookie authCookie = FormsAuthentication.GetAuthCookie(UserName.Text, RememberMe.Checked);
برای کارآیی صحیح FormsAuthenticationTicket قرار داده شده در داخل کوکی، نیاز است که متد Decrypt از کلاس FormsAuthentication فراخوانی شده و مقدار کوکی به آن ارسال شود.
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(authCookie.Value);
سپس یک نمونه جدید از FormsAuthenticationTicket بر پایه مقدار FormsAuthenticationTicket موجود، ایجاد میکنیم. در نتیجه، برچسب جدید شامل اطلاعات دقیق کاربر میباشد (userDataString).
FormsAuthenticationTicket newTicket = new FormsAuthenticationTicket(ticket.Version, ticket.Name, ticket.IssueDate, ticket.Expiration, ticket.IsPersistent, userDataString);
سپس نمونه جدید FormsAuthenticationTicket را به وسیله فراخوانی متد Encrypt رمزنگاری (و تعیین اعتبار) کردیم و این دادههای رمزنگاری (و تعیین اعتبار) شده را در authCookie قرار دادیم.
authCookie.Value = FormsAuthentication.Encrypt(newTicket);
در پایان authCookie به مجموعه Response.Cookies اضافه و متد GetRedirectUrl برای تعیین هدایت کاربر به صفحه مناسب فراخوانی گردید.
Response.Cookies.Add(authCookie);
string redirUrl = FormsAuthentication.GetRedirectUrl(UserName.Text, RememberMe.Checked);
Response.Redirect(redirUrl);
تمام کدهای بالا مورد نیاز است، زیرا مشخصه UserData، فقط خواندنی است و کلاس FormsAuthentication هیچگونه متدی برای مقداردهی به UserData فراهم نکرده است.
بسیاری از برنامههای کاربردی وب، اطلاعاتی در مورد کاربر جاری نمایش میدهند و یا اساس نمایش صفحه وب را بر اساس کاربر وارد شده تغییر میدهند. برای مثال، یک برنامه کاربردی وب ممکن است نام کاربر و آخرین زمانی که او وارد شده است را در گوشه بالای هر صفحه نمایش دهد. برچسب احراز هویت فرمها نام کاربر جاری وارد شده را نگهداری میکند، اما اگر اطلاعات دیگری مورد نیاز است، برنامه باید به محل نگهداری اطلاعات کاربر، به طور معمول بانک اطلاعاتی، رفته و اطلاعاتی که در برچسب احراز هویت وجود ندارد را پیدا کند.
با مقدار کمی کد، میتوانیم اطلاعات اضافی کاربر را در برچسب احراز هویت فرم ها نگهداری کنیم. این اطلاعات را میتوانیم از طریق مشخصه UserData کلاس FormsAuthenticationTicket نمایش دهیم. این یک مکان مناسب برای قراردادن مقدار کمی اطلاعات در مورد کاربر که معمولا مورد نیاز است، میباشد. مقدار مشخص شده در مشخصه UserData به عنوان قسمتی از کوکی برچسب احراز هویت شناخته شده و، مشابه دیگر فیلدها برچسب، بر پایه پیکربندی سیستم احراز هویت رمزنگاری می شود. به طور پیش فرض، UserData یک رشته تهی است.
برای نگهداری دادههای کاربر در برچسب احراز هویت، نیاز است که مقداری کد در صفحه ورود نوشته شود تا اطلاعات دقیق کاربر را به دست آورده و در برچسب نگهداری کند. از آنجایی که UserData یک مشخصه از نوع string است، دادههای نگهداری شده در آن باید به طور صحیح مانند یک رشته مرتب شوند. برای مثال، فرض کنید در محل نگهداری اطلاعات کاربران ما، فیلدهایی برای ذخیره تاریخ تولد و نام کارفرمای آنها وجود دارد و ما میخواهیم مقدار این دو مشخصه را در برچسب احراز هویت نگهداری کنیم. باید این مقادیر را با قرار دادن "|" بعد از تاریخ تولد و در ادامه آوردن نام کارفرما، داخل یک رشته مرتب کنیم. مانند “1974-08-15|Northwind Traders”. همچنین هنگام نیاز به این اطلاعات باید آنها را به صورت دو زیررشته از هم جدا کنیم.