امنيت برنامه های وب ( بخش چهارم )
آنچه تاکنون گفته شده است :
-
بخش اول : مفاهيم اوليه و روش های متفاوت تائيد کاربران
-
بخش دوم : بررسی Windows Authentication
-
بخش سوم : بررسی Forms Authentication
همانگونه که در بخش سوم اين مقاله اشاره گرديد ، به منظور استفاده از روش Forms Authentication ، می بايست مراحل زير را دنبال نمود :
-
<LI dir=rtl>مقداردهی Authentication mode در فايل Web.config به Forms <LI dir=rtl>ايجاد يک فرم وب به منظور اخذ اطلاعات کاربران ( Logon Page ) <LI dir=rtl>ايجاد يک فايل و يا بانک اطلاعاتی به منظور ذخيره نام و رمز عبور کاربران <LI dir=rtl>نوشتن کد لازم به منظور افزودن کاربر جديد به فايل و يا بانک اطلاعاتی کاربران
-
نوشتن کد لازم به منظور تائيد کاربران با استناد به فايل و يا بانک اطلاعاتی کاربران
در بخش سوم اين مقاله به بررسی اولين مرحله ( مقداردهی Authentication mode در فايل Web.config به Forms ) ، اشاره گرديد . در ادامه به بررسی ساير مراحل لازم به منظور استفاده از روش Forms Authentication ، خواهيم پرداخت .
Web.Config setting for Forms Authentication
<authentication mode="Forms">
<forms loginUrl =" Login.aspx" >
<credentials passwordFormat = "SHA1" >
<user name = "Srco.ir" Password ="110" />
<user name = "SakhaRavesh" Password ="111" />
</credentials>
</forms>
</authentication>
ايجاد يک فرم وب Logon
به منظور تائيد کاربران بر اساس روش Forms Authentication ، نيازمند استفاده از يک فرم وب بوده که با استفاده از آن امکان Logon کاربران ، فراهم گردد. فرم وب با استفاده از عنصر <forms> در فايل Web.Config ، مشخص شده و می تواند صرفا" شامل دو Text box و يک Button و يا شامل فيلدهای اطلاعاتی بيشتری به منظور اخذ اطلاعات کاربران باشد .

Login.aspx
<%@ Page Language="vb" Codebehind="Login.aspx.vb" Inherits="Web1.Login" codePage="65001" %>
<HTML>
<HEAD>
<title>صفحه تائيد کاربران برنامه</title>
<meta name="vs_showGrid" content="True">
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
</HEAD>
<BODY bgColor="#ffffff">
. ...
<asp:Button id="btnSingIn" runat="server" Text="Sign in"></asp:Button>
<asp:TextBox id="txtUserName" runat="server" Width="99px"></asp:TextBox>
<asp:TextBox id="txtPassword" runat="server" Width="100px" TextMode="Password"></asp:TextBox>
...
Login.aspx.vbImports System.Web.Security
Public Class Login
...
Private Sub btnSingIn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSingOn.Click
If FormsAuthentication.Authenticate(txtUserName.Text, txtPassword.Text) Then
FormsAuthentication.RedirectFromLoginPage(txtUserN ame.Text, True)
Else
txtPassword.Text = ""
If CInt(ViewState("Tries")) > 1 Then
Response.Redirect("Denied.htm")
Else
ViewState("Tries") = CInt(ViewState("Tries")) + 1
End If
End If
End Sub
...
فEnd Class
توضيحات
-
<LI dir=rtl>کلاس FormsAuthentication بخشی از namespace با نام System.Web.Security می باشد ، بنابراين می بايست با استفاده از Imports ( در ويژوال بيسک دات نت ) آن را به برنامه Include نمائيم ( درويژوال سی شارپ ، استفاده از Using ) .
<LI dir=rtl>متد Authenticate مربوط به کلاس FormsAuthentication با مراجعه به ليست کاربران تعريف شده توسط عنصر<credentials> فايل Web.Config ، بررسی لازم در خصوص نام ورمز عبور کاربر را انجام می دهد.
<LI dir=rtl>متد RedirectFromLoginPage مربوط به کلاس FormsAuthentication ، صفحه شروع برنامه وب را نمايش خواهد داد.
-
در صورتيکه نام و رمز عبور کاربر معتبر نباشد ، به کاربر دو مرتبه ديگر فرصت Logon داده خواهد شد و در صورتيکه صلاحيت کاربر تائيد نگردد ، يک پيام خطاء نمايش داده می شود. صفحه گزارش خطاء از نوع HTM می باشد.( به هيچکدام از فرم های وب موجود در برنامه ، امکان دستيابی وجود نخواهد داشت ). در صورتيکه کاربر با استفاده از روش فوق به صفحه ديگر هدايت می شود ، می بايست از محل استقرار فايل فوق در محيطی خارج از حوزه برنامه مطمئن گرديد .
در مثال فوق ، صفحه شروع برنامه Webform1.aspx ( در بخش دوم اين مقاله ) در نظر گرفته شده است . پس از Logon موفقيت آميز، کاربر به صفحه فوق هدايت خواهد شد . زمانيکه کاربر بر روی دکمه sign in کليک می نمايد ، تائيد کاربر بر اساس نام و رمز عبور انجام و برای وی يک مجوز صادر خواهد شد. بدين ترتيب، کاربر امکان دستيابی به بخش های متفاوت برنامه را بدست می آورد .ماحصل اجرای صفحه فوق ، به صورت زير است :
از کلاس FormsAuthentication به منظور Sign out ، و يا حذف کوکی Authentication از روی ماشين کاربر استفاده می گردد.کد زير دستيابی کاربر به برنامه را خاتمه داده و استفاده مجدد از برنامه توسط وی را ملزم به Login مجدد ، می نمايد .
End User's access to an application
Imports System.Web.Security
Private Sub butSignOut_Click ( ByVal sender As System.Object , ByVal e As System.EventArgs ) Handles butSignOut.Click
FormsAuthentication.SignOut ( )
Response.Redirect( "UserInfo.aspx")
End Sub
تائيد کاربران با استفاده از يک بانک اطلاعاتی
در بخش قبل با فرآيند تائيد کاربران با استفاده از ليست تعريف شده کاربران موجود در فايل Web.Config ، آشنا شديم . متد Authenticate مربوط به کلاس FormsAuthentication ، به منظور خواندن اطلاعات از فايل فوق بصورت اتوماتيک ، پيکربندی شده است . رويکردد فوق ، گزينه ای مناسب در مواردی است که مسئوليت تعريف اسامی و رمز عبور کاربران به مدير سيستم واگذار شده باشد . در صورتيکه قصد داشته باشيم ، امکان تعريف نام و رمز عبور را در اختيار کاربران قرار دهيم ، می بايست اطلاعات مربوط به کاربران خارج از فايل Web.config ذخيره گردد. اعمال تغييرات در فايل Web.config در زمان اجراء ، باعث Restart شدن برنامه شده و Reset تمامی متغيرهای Session و Application استفاده شده توسط برنامه می گردد. دراين رابطه می توان ، اسامی کاربران را در هر نوع فايلی ذخيره نمود . بديهی است استفاده از يک بانک اطلاعاتی، مزايای خاص خود را بدنبال خواهد داشت :
-
<LI dir=rtl>اسامی کاربران می تواند به عنوان کليد اوليه و به منظور ذخيره سازی ساير اطلاعات کاربران استفاده گردد . <LI dir=rtl>بانک های اطلاعاتی دارای کارآئی مطلوب به منظور دستيابی به اسامی و رمز عبور کاربران می باشند .
-
افزودن ، تغيير و دستيابی به رکوردهای بانک اطلاعاتی با استفاده از استانداردهای SQL انجام خواهد شد .
زمانيکه اسامی و رمز عبور کاربران در يک فايل و يا بانک اطلاعاتی ذخيره می گردد ، می توان با استفاده از متد HashPasswordeForStoringInConfigFile مربوط به کلاس FormsAuthentication ، آنان را رمز نمود. در اين رابطه از الگوريتم های SHA1 و يا MD5 به منظور رمزنگاری داده استفاده می گردد :
Encrypting User names and passwords
Password = FormsAuthentication.HashPasswordForStoringInConfigFile ( Password , "SHA1")
افزودن کاربران به يک بانک اطلاعاتی
به منظور افزودن کاربران به يک بانک اطلاعاتی ، اطلاعات مربوط به کاربران شامل نام و رمز عبور را از طريق دو TextBox اخذ و در ادامه با ايجاد يک Event Procedure ، آنان را به بانک اطلاعاتی اضافه نموده و در نهايت پيام مناسبی که نشاندهنده درج اطلاعات کاربر در بانک اطلاعاتی سيستم می باشد ، نمايش داده خواهد شد . روتين زير با فراخوانی تابع AddUser ، نام و رمز عبور کاربر را به بانک اطلاعاتی اضافه می نمايد .
َAdding User to a database
Private Sub butNewUser_Click ( ByVal sender As System.Object , ByVal e As System.EventArgs ) Handles butNewUser.Click
If AddUser(txtName.Text, txtPassword.Text) Then
spnNote.InnerText = "کاربر جديد به بانک اطلاعاتی کاربران اضافه گرديد "
Else
spnNote.InnerText = "کاربری با اين مشخصات وجود دارد "
End If"
End If
End Sub
تابع AddUser ، که در روتين فوق استفاده شده است ، در ابتدا رمز عبور کاربر را رمز نموده و در ادامه با استفاده از دستور SQL INSERT ، نام و رمز عبور را در بانک اطلاعاتی ذخيره می نمايد .درصورتيکه رمز عبور در نظر گرفته شده توسط کاربر، قبلا" توسط کاربر ديگر تعريف و در بانک اطلاعاتی موجود باشد ، بلاک Exeption -handling ، خطاء را تشخيص داده و مقدار False را مبنی بر عدم افزودن اطلاعات کاربر در بانک اطلاعاتی ، برمی گرداند .
َAddUser Function
Private Function AddUser ( Byval UserName As String , ByVal Password As String ) As Boolean
Dim bSuccess As Boolean
Password = FormsAuthentication.HashPasswordForStoringInConfigFile ( Password , "SHA1")
Dim oleCommand As New OleDbCommand ( "INSERT INTO Users " + "Values ( '" + UserName + '" + Password + "')",oledbUsers)
Try
oledbUsers.Open ( )
If oleCommand.ExecuteNonQuery ( ) Then bSuccess = True
oledbUsers.Close ( )
Catch
bSuccess =False
oledbUsers.Close ( )
End Try
Return bSuccess
End Function
در زمان تائيد کاربران با استفاده از ليست مشخص شده کاربران در فايل Web.Config ، از متد Authenticate استفاده می گردد. در موارديکه برای تائيد کاربران از بانک اطلاعاتی استفاده می گردد ، می بايست کد لازم به منظور يافتن و مقايسه نام و رمز عبور کاربران ، نوشته گردد . روتين زير ، از تابع CheckPassword به منظور تائيد نام و رمز عبور استفاده نموده و در صورتيکه صلاحيت کاربر تائيد گردد به وی امکان دستيابی به برنامه داده خواهد شد.
َAuthenticating Users from a database
Private Sub butSignOn_Click ( ByVal sender As System.Object , ByVal e As System.EventArgs ) Handles butSignOn.Click
If CheckPassword(txtName.Text, txtPassword.Text) Then
FormsAuthentication.RedirectFromLoginPage(txtName. Text, True)
Else
spnNote.InnerText = "نام و يا رمز عبور اشتباه است ، مجددا سعی نمائيد"
ViewState("tries") = ViewState("tries") + 1
If ViewState("Tries") > 3 Then
Response.Redirect("Denied.htm")
End If
End If
End Sub
تابع CheckPassword ، در ابتدا رمز عبور کاربر را با استفاده از الگوريتم مشخص شده ، رمز می نمايد. در ادامه ، رکورد بانک اطلاعاتی بر اساس نام جستجو و پس از يافتن رکورد مربوطه، مقايسه بين رمز عبور رمز شده در مقابل رمز عبور موجود در بانک اطلاعاتی ، انجام خواهد شد . دستيابی به بانک اطلاعاتی از طريق يک بلاک Exception handling انجام تا پيشگيری لازم در خصوص مسئله Locking ، انجام شود .
َCheckPassword Function
Private Function CheckPassword ( Byval UserName As String , ByVal Password As String ) As Boolean
Dim bSuccess As Boolean
Password = FormsAuthentication.HashPasswordeForStoringInConfigFile ( Password , "SHA1")
Dim oleCommand As New OleDbCommand ( "SELECT * FROM Users" + "WHERE UserName='" + txtName.Text + "'" , oledbUsers )
Try
oledbUsers.Open ( )
Dim rdrUsers As OledbDataReader = oleCommand.ExecuteReader ( )
While rdrUsers.Read( )
If Password =rdrUsers.Item("Password") Then bSuccess = True
End While
If oleCommand.ExecuteNonQuery ( ) Then bSuccess = True
oledbUsers.Close ( )
Catch
bSuccess =False
oledbUsers.Close ( )
End Try
Return bSuccess
End Function
تمامی کاربران با توجه به تنظيمات انجام شده در بخش <authentication> فايل Web.config ، بصورت اتوماتيک به صفحه LoginBaseDb.aspx هدايت خواهند شد .
Web.Config file setting for <authentication> element
<authentication mode="Forms">
<forms name="Test1Cookie" loginUrl ="LoginBaseDB.aspx" timeout="15"></forms>
</authentication>
صفحه LoginBaseDb.aspx :
در صورت درج نام و رمز عبور غيرمعتبر و فشردن دکمه "ورود به سايت " توسط کاربر ، يک پيام خطاء نمايش داده می شود ( در صورت تائيد نام و رمز عبور ، امکان دستيابی کاربر به برنامه فراهم می گردد) .
پس از درج نام و رمز عبور و فشردن دکمه " کاربر جديد " ، مشخصات کاربر در بانک اطلاعاتی کاربران ذخيره می گردد .
در بخش پنجم اين مقاله به بررسی روش Passport Authentication خواهيم پرداخت .