آنچه مسلم است، ما باید اطلاعات متفاوتی به کاربران شناسایی شده و کاربران ناشناس نمایش دهیم. علاوه بر این اغلب اوقات ما نیاز داریم که مشخصات کاربر شناسایی شده را بدانیم.
اجازه دهید برای شرح دادن این شیوه صفحه Default.aspx را تکمیل کنیم. در صفحه Default.aspx دو کنترل Panel اضافه کنید؛ یکی به نام AuthenticatedMessagePanel و دیگری به نام AnonymousMessagePanel. یک کنترل Lable به نام WelcomeBackMessage در داخل Panel اول اضافه کنید. در داخل Panel دوم یک کنترل Hyperlink اضافه کنید و مشخصه Text آن را به Log In و مشخصه NavigateUrl آن را به ~/Login.aspx تغییر دهید. در این حالت کدهای صفحه Default.aspx باید به صورت زیر باشد:
<%@ Page Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" Title="Untitled Page" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server">
<asp:Panel runat="server" ID="AuthenticatedMessagePanel">
<asp:Label runat="server" ID="WelcomeBackMessage"></asp:Label>
</asp:Panel>
<asp:Panel runat="Server" ID="AnonymousMessagePanel">
<asp:HyperLink runat="server" ID="lnkLogin" Text="Log In" NavigateUrl="~/Login.aspx"></asp:HyperLink>
</asp:Panel>
</asp:Content>
مشخصه Request.IsAuthenticated یک مقدار بولی که تعیین میکند درخواست احراز هویت شده است یا نه، را برمیگرداند.
کدهای زیر را در رویداد Page_Load بنویسید:
protected void Page_Load(object sender, EventArgs e)
{
if(Request.IsAuthenticated)
{
WelcomeBackMessage.Text = "Welcome back!";
AuthenticatedMessagePanel.Visible = true;
AnonymousMessagePanel.Visible = false;
}
else
{
AuthenticatedMessagePanel.Visible = false;
AnonymousMessagePanel.Visible = true;
}
}
با فرض اینکه شما هنوز وارد سایت نشدهاید، با اجرای صفحه Default.aspx یک پیوند به صفحه Login میبینید (شکل زیر).
با استفاده از مشخصه User شیء Httpcontext میتوانیم کاربر جاری را شناسایی کنیم. شیء Httpcontext اطلاعاتی در مورد درخواست جاری نمایش میدهد. همچنین این شیء مکانی برای اشیاء عمومیASP.NET مانند Response، Request و Session و غیره میباشد.
مشخصه User به وسیله FormsAuthenticationModule تنظیم میشود. به ویژه، هنگامی که FormsAuthenticationModule یک برچسب احراز هویت فرمها در داخل درخواست وارد شده پیدا میکند، یک شیء جدید از GenericPrincipal ایجاد و آن را به مشخصه User نسبت میدهد.
اشیاء Principal (مانند GenericPrincipal) اطلاعاتی درباره مشخصات کاربر و نقشی که به آن تعلق دارند را تهیه میکنند. برای واسط IPrincipal دو عضو تعریف گردیده است:
· IsInRole(roleName): یک متد است که یک مقدار بولی که نشان میدهد که Principal متعلق به نقش مشخص شده هست یا نه، را برمیگرداند.
· Identity: یک مشخصه است که یک شیء که رابط IIdentity را پیاده سازی میکند را برمیگرداند. برای IIdentity سه مشخصه تعریف شده است: AuthenticationType، IsAuthenticated و Name.
ما با استفاده از کد زیر میتوانیم نام بازدید کننده جاری را به دست آوریم:
string currentUserName = User.Identity.Name;
وقتی از احراز هویت فرمها استفاده میشود یک شیء FormsIdentity برای مشخصه GenericPrincipal’s Identity ایجاد میشود. کلاس FormsIdentity همیشه برای مشخصه AuthenticationType رشته "Forms" و برای مشخصه IsAuthenticated مقدار true را برمیگرداند. مشخصه Name نام کاربری که هنگام ایجاد برچسب احراز هویت فرمها مشخص شده است را برمیگرداند.
حالا صفحه Default.aspx را طوری تغییر میدهیم که جمله خوش آمدگویی شامل نام کاربر نیز باشد. بدین منظور کد زیر را در رویداد Page_Load قرار میدهیم:
WelcomeBackMessage.Text = "Welcome back, " + User.Identity.Name + "!";
وقتی که کاربر اعتبارنامهاش که شامل نام کاربری و رمز عبور است را وارد و فرم صفحه ورود را ارسال میکند، اعتبارنامه از طریق اینترنت و به صورت متن ساده به وب سرور انتقال مییابد. آن به این معنی است که هر هکری که در حال نظارت بر ترافیک شبکه است می تواند نام کاربری و رمز عبور را ببیند. برای جلوگیری از این مشکل، باید ترافیک شبکه را با استفاده از SSL[1] رمزدار کنیم. این تضمین میکند که اعتبارنامه (همچنین نشانهگذاریهای صفحه HTML) از لحظهای که مرورگر را ترک میکنند تا لحظهای که به وسیله وب سرور دریافت میشوند، رمز گذاری شدهاند. اگر وب سایت شما دارای اطلاعات حساس نباشد، شما فقط در صفحه ورود و صفحات دیگری که رمز عبور کاربر را دارد، نیاز دارید که از SSL استفاده کنید، و صفحات دیگر به صورت متن ساده ارسال میشوند. تا زمانی که، به طور پیش فرض، از دو روش رمزگذاری و امضاء دیجیتالی (برای جلوگیری از دستکاری) استفاده میشود، لازم نیست که نگران امنیت برچسب احراز هویت فرمها باشید.
با فرض اینکه اعتبارنامه های وارد شده معتبر هستند، باید یک برچسب احراز هویت فرمها ایجاد شود، تا به وسیله آن کاربر وارد سایت گردد. کلاس FormsAuthentication در فضای نام System.Web.Security متدهای متفاوتی برای ورود و خروج کاربران از طریق سیستم احراز هویت فرمها، در اختیار قرار میدهد. با وجود اینکه چندین متد در کلاس FormsAuthentication وجود دارد، برای ما سه متد از آنها جالب هستند که عبارتند از:
· GetAuthCookie (username, persistCookie): این متد یک برچسب احراز هویت فرمها ایجاد میکند که نام کاربری نامیده میشود. سپس، این متد یک شیء HttpCookie که محتویات برچسب احراز هویت را نگهداری میکند، ایجاد و آن را برمیگرداند. اگر مقدار persistCookie برابر true باشد، یک کوکی پایدار ایجاد میشود.
· SetAuthCookie (username, persistCookie): این متد، متد GetAuthCookie را فراخوانی میکند تا کوکی احراز هویت فرمها را تولید کند. سپس این متد کوکی برگردانده شده توسط GetAuthCookie را به مجموعه Cookies اضافه میکند (با فرض اینکه احراز هویت فرمها بر پایه کوکی به کار گرفته شده باشد؛ در غیر این صورت، این متد یک کلاس داخلی که برچسب منطقی بدون کوکی ایجاد میکند را فراخوانی میکند).
· RedirectFormLoginPage (username, persistCookie): این متد، متد SetAuthCookie را فراخوانی میکند و بعد از آن کاربر را به صفحه مورد نظر هدایت مینماید.
GetAuthCookie وقتی سودمند است که شما نیاز دارید برچسب احراز هویت را قبل از اینکه کوکی خارج از مجموعه کوکیها بنویسید، تغییر دهید. اگر شما بخواهید برچسب احراز هویت فرمها ایجاد و آن را به مجموعه کوکیها اضافه کنید، اما نخواهید کاربر را به صفحه مورد نظر هدایت کنید، SetAuthCookie کاربرد دارد. ممکن است شما بخواهید آنها را در صفحه ورود نگهدارید و یا به صفحات جایگزین بفرستید.
زمانی که ما میخواهیم کاربر وارد و به صفحه مورد نظر هدایت شود، از RedirectFormLoginPage استفاده میکنیم. در رویداد LoginButton’s Click دو خط TODO را با دستور زیر جابجا میکنیم:
FormsAuthentication.RedirectFromLoginPage(UserName.Text, RememberMe.Checked);
وقتی که برچسب احراز هویت فرمها را ایجاد میکنیم از مشخصه متن جعبه متن UserName برای پارامتر username و وضعیت چک باکس RememberMe برای پارامتر persistCookie برچسب احراز هویت استفاده میکنیم.