برچسب احراز هویت فرمها یک نشانه است که هرگونه خصوصیتی را نمایش میدهد. با برچسب احراز هویت بر پایه کوکی، این نشانه در یک قالب از یک کوکی نگهداری میشود و در هر درخواست به وب سرور ارسال میشود. در اختیار داشتن این نشانه، اعلان می کند که: "من کاربر هستم، در حال حاضر وارد سیستم شده ام." و برای اینکه هویت کاربر در تمام صفحاتی که بازدید میکند، قابل تشخیص باشد، استفاده میشود. برچسب احراز هویت فرمها فقط شامل مشخصات کاربر نیست، بلکه حاوی اطلاعاتی برای کمک به ایمنی و بینقصی نشانه میباشد.
یکی از اطلاعات در برچسب زمان انقضاء میباشد، که تاریخ و زمانی که برچسب دیگر معتبر نیست را مشخص میکند. هر زمان که FormsAuthenticationMadule یک برچسب احراز هویت را بررسی میکند، مراقبت میکند که زمان انقضاء برچسب هنوز نگذشته باشد. اگر گذشته باشد، برچسب را نادیده میگیرد و با کاربر به عنوان یک فرد ناشناس برخورد میکند. این روش به حفاظت کردن در مقابل حملات کمک میکند. بدون زمان انقضاء، اگر یک هکر بتواند به برچسب احراز هویت معتبر کاربر دست پیدا کند، مثلا از طریق دسترسی فیزیکی به کامپیوتر و از آن طریق به پوشه کوکیها، میتواند با استفاده از این برچسب احراز هویت دزدیده شده یک درخواست به سرور ارسال کرده و داخل سایت شود. وقتی که برچسب احراز هویت ایجاد میشود، سیستم احراز هویت فرمها با نگاهی به تنظیمات timeout درباره زمان انقضاء آن تصمیم میگیرد. همانطور که در جدول بالا ذکر شده، مقدار پیش فرض تنظیم timeout 30 دقیقه است، و به این معنی است که وقتی برچسب احراز هویت فرمها ایجاد شد، زمان زمان انقضاء آن برای 30 دقیقه بعد تنظیم میشود.
زمان انقضاء، یک زمان قطعی در آینده را برای منقضی شدن برچسب احراز هویت مشخص میکند. اما معمولا توسعهدهندگان میخواهند از زمان انقضاء تبدیلی استفاده کنند، یعنی اینکه در هربار که کاربر سایت را میبیند، برچسب از ابتدا زماندهی شود. این خواسته با تنظیمات slidingExpiration قابل انجام است. اگر برابر true قرار داده شود، هر زمان که FormsAuthenticationModule یک کاربر را شناسایی میکند، زمان انقضاء برچسب را به روز میکند. اگر برابر false (پیش فرض) قرار داده شود، زمان انقضاء در هر درخواست به روز نمیشود، در نتیجه برچسب دقیقا بعد از اتمام timeout که از هنگام ایجاد شدن شروع شده است، منقضی میشود.
در شکل زیر : زمان انقضاء برچسب احراز هویت وقتی slidingExpiration برابر false است.
در شکل زیر: زمان انقضاء برچسب احراز هویت وقتی slidingExpiration برابر true است.
وقتی از برچسب احراز هویت بر پایه کوکی (پیش فرض) استفاده میکنید، این بحث مقداری گیج کننده میشود، زیرا خود کوکی نیز میتواند زمان انقضاء داشته باشد. زمان انقضاء کوکی به مرورگر میفهماند که چه زمانی باید آن را نابود کند. اگر یک کوکی ناقص بود (زمان انقضاء آن مشخص نبود) وقتی مرورگر بسته میشود نابود میگردد. اگر زمان انقضاء کوکی مشخص شده باشد در کامپیوتر کاربر نگهداری میشود تا زمان مشخص شده سپری گردد، سپس نابود میشود. وقتی کوکی توسط مرورگر نابود شود، دیگر به سرور فرستاده نمیشود، بنابراین، نابود شدن کوکی مانند خارج شدن کاربر از سایت است.
اجازه دهید زمان انقضاء برچسب در سایت خودمان را با استفاده از زمان انقضاء تبدیلی، به یک ساعت تغییر دهیم. برای این منظور باید تغییراتی در فایل Web.config بدهیم.
<authentication mode="Forms">
<forms
slidingExpiration="true"
timeout="60"
/>
</authentication>
مرحله اول: آزمایش تنظیمات پیکربندی <Forms>
سیستم احراز هویت فرمها درASP.NET تعدادی تنظیمات پیکربندی ارائه میدهد که میتواند بر پایه برنامهنویسی انجام شود. شامل تنظیماتی مانند: چرخه حیات برچسب احراز هویت فرمها، چه میزان امنیت به برچسب اعمال شود، تحت چه شرایطی برچسب احراز هویت بدون کوکی استفاده شود، نشانی صفحه ورود و اطلاعات دیگر. برای تغییر مقادیر پیش فرض، یک عنصر <forms> به عنوان فرزند عنصر <authentication> اضافه کرده و مقادیر مشخصههایی که میخواهید را در قالب XML تغییر دهید، مانند:
<authentication mode="Forms">
<forms
propertyName1="value1"
propertyName2="value2"
...
propertyNameN="valueN"
/>
</authentication>
در جدول زیر خلاصهای از مشخصاتی که میتوان در عنصر <forms> به دلخواه تغییر داد، آورده شده است. از آنجایی که web.config یک فایل XML است، مشخصهها به کوچک و بزرگی حروف حساس هستند.
نشانه (Attribute) | توصیف (Description) |
Cookieless | این نشانه مشخص میکند تحت چه شرایطی برچسب احراز هویت در کوکی ذخیره شود و یا اینکه در URL درج گردد. مقادیر مجاز این نشانه عبارتند از: UseCookiess; UseUri; AutoDetect; UseDeviceProfile (Default) |
defaultUrl | اگر مقدار RedirectUrl در رشته پرس و جو مشخص نشده باشد، نشانی که کاربر بعد از وارد شدن به سایت از طریق صفحه ورود به آن هدایت میشود در این مشخصه نگهداری میشود. |
Domain | وقتی از برچسب احراز هویت بر پایه کوکی استفاده میکنید این نشانه، نشانی کوکی را مشخص میکند. مقدار پیش فرض یک مقدار تهی است و بستگی دارد به اینکه مرورگر شما چه نشانی را نشان میدهد؛ مانند www.yourdomain.com. در این حالت وقتی درخواست subdomain ارسال میشود، کوکی ارسال نمیگردد. اگر میخواهید در subdomainها هم کوکی ارسال شود باید نشانی را به صورت yourdomain.com بنویسید. |
enableCrossAppRedirects | یک مقدار بولی است که تعیین میکند که اگر کاربر شناسایی شده بخواهد، در حالت شناسایی بماند هنگامی که به یک نشانی وب دیگری در همان سرور میرود. مقدار این به طور پیش فرض false است. |
loginUrl | نشانی صفحه ورود. مقدار پیش فرض آن login.aspx |
Name | نام کوکی است، هنگامی که از برچسب احراز هویت بر پایه کوکی استفاده میکنید. مقدار پیش فرض آن .ASPXAUTH |
Path | هنگامی که از برچسب احراز هویت بر پایه کوکی استفاده میکنید، این نشانه نشانی کوکی را مشخص میکند. |
Protection | مشخص میکند از چه روشی برای محافظت از برچسب احراز هویت فرمها استفاده شود. مقادیر مجاز عبارتند از: All (Default); Encription; None; Validation |
requireSSL | یک مقدار بولی که مشخص میکند یک ارتباط SSL برای ارسال کوکی نیاز دارد. مقدار پیش فرض false است. |
slidingExpiration | یک مقدار بولی که مشخص میکند در هر بازدید کاربر از سایت در طول یک جلسه، زمان پایان کوکی از ابتدا شروع شود. مقدار پیش فرض آن false است. |
Timeout | زمانی که طول میکشد تا کوکی برچسب احراز هویت منقضی شود را مشخص میکند (به دقیقه). مقدار پیش فرض 30 است. |
علاوه بر متدهایی برای ورود کاربر، کلاس FormsAuthentication یک متد SignOut نیز فراهم میکند. متد SignOut به راحتی برچسب احراز هویت فرمها را خراب میکند و باعث خروج کاربر از سایت میشود.
کنترل LoginStatus بسته به وضعیت شناسایی کاربر یکی از این دو پیوند را نمایش میدهد: ورود و یا خروج. کلیک کردن بر روی پیوند ورود، باعث هدایت کاربر به صفحه ورود میشود. کلیک کردن پیوند خروج باعث میشود کنترل LoginStatus متد FormsAuthentication.SignOff را فراخوانی کرده و سپس کاربر را به یک صفحه هدایت کند. صفحهای که کاربر خارج شده به آن هدایت میشود به مشخصه LogoutAction بستگی دارد، که میتواند یکی از سه مقدار زیر را داشته باشد:
· Refresh: پیش فرض؛ کاربر را به صفحهای که در حال دیدن آن بوده هدایت میکند. اگر کاربر ناشناس اجازه دیدن آن صفحه را نداشته باشد، FormsAuthenticationModule به طور خودکار کاربر را به صفحه ورود هدایت میکند.
· Redirect: کاربر به صفحهای که در مشخصه LogoutPageUrl کنترل LoginStatus مشخص شده هدایت میشود.
· RedirectToLoginPage: کاربر به صفحه ورود هدایت میشود.
اجازه دهید یک کنترل LoginStatus به مسترپیج اضافه کنیم و آن را با استفاده از گزینه Redirect پیکربندی نموده، به طوری که کاربر به صفحهای که پیامی مبنی بر تایید خروج کاربر نمایش میدهد؛ فرستاده شود. یک صفحه جدید به ریشه اضافه کرده و نام آن را Logout.aspx بگذارید. یادتان باشد که مسترپیج به آن اعمال شود. در صفحه جدید متنی مبنی بر تایید خروج کاربر بنویسید.
سپس در صفحه مسترپیج یک کنترل LoginStatus در زیر کنترل LoginView در داخل LoginContent اضافه کنید. در پایان باید کدهای صفحه به صورت زیر باشد:
<div id="navigation">
<asp:ContentPlaceHolder ID="LoginContent" runat="server">
<asp:LoginView ID="LoginView1" runat="server">
<LoggedInTemplate>
Welcome back,
<asp:LoginName ID="LoginName1" runat="server" />
</LoggedInTemplate>
<AnonymousTemplate>
Hello, stranger.
<asp:HyperLink ID="lnkLogin" runat="server" NavigateUrl="~/Login.aspx">Log In</asp:HyperLink>
</AnonymousTemplate>
</asp:LoginView>
<br />
<asp:LoginStatus ID="LoginStatus1" runat="server" LogoutAction="Redirect" LogoutPageUrl="~/Logout.aspx" />
<br /><br />
</asp:ContentPlaceHolder>
TODO: Menu will go here...
</div>