Выполнение проверки подлинности на основе форм в приложениях ASP.NET с помощью Microsoft Visual Basic .NET

Переводы статьи Переводы статьи
Код статьи: 308157 - Vizualiza?i produsele pentru care se aplic? acest articol.
Данная статья была ранее опубликована под номером RU308157
Развернуть все | Свернуть все

В этой статье

Аннотация

В данной статье рассматривается пример приложения, выполняющего проверку подлинности на основе форм и использующего базу данных для хранения реквизитов пользователей.

Требования

Параметры оборудования и сети, а также необходимое программное обеспечение и пакеты обновлений:
  • Microsoft Visual Studio .NET.
  • Microsoft SQL Server
  • Microsoft Internet Information Services (IIS) 5.0 или более поздней версии

Создание приложения ASP.NET с помощью Visual Basic .NET

  1. Запустите Visual Studio .NET.
  2. Создайте новое веб-приложение ASP.NET и укажите его имя и расположение.

Настройка параметров безопасности в файле Web.config

Ниже рассматривается добавление разделов <authentication> и <authorization> с целью настройки приложения ASP.NET для выполнения проверки подлинности на основе форм.
  1. В обозревателе решений откройте файл Web.config.
  2. Измените режим проверки подлинности на Forms.
  3. Вставьте тег <Forms> и укажите нужные атрибуты. За дополнительной информацией об этих атрибутах обратитесь к документации MSDN или документации QuickStart, указанной в разделе Ссылки данной статьи. Скопируйте представленный ниже код и выберите в меню Правка команду Вставить как HTML, чтобы вставить данный код в раздел <authentication> файла:
    <authentication mode="Forms">
    	<forms name=".ASPXFORMSDEMO" loginUrl="logon.aspx" 
    	protection="All" path="/" timeout="30" />
    </authentication>
    					
  4. Запретите доступ анонимным пользователям. Для этого вставьте в раздел <authorization> следующий код:
    <authorization>
    	<deny users ="?" />
    	<allow users = "*" />
    </authorization>
    					

Создание базы данных, хранящей данные о пользователях

В данном разделе описывается создание базы данных, хранящей имена, пароли и роли пользователей. Поле для хранения ролей необходимо в тех случаях, когда система безопасности должна основываться на ролях пользователей.
  1. Запустите программу «Блокнот». Для этого нажмите кнопку Пуск, выберите пункт Выполнить и введите команду notepad.
  2. Выделите код представленного ниже сценария SQL, щелкните его правой кнопкой мыши и выберите команду Копировать. В программе «Блокнот» в меню Правка выберите команду Вставить и вставьте скопированный код:
    if exists (select * from sysobjects where id = 
    object_id(N'[dbo].[Users]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    drop table [dbo].[Users]
    GO
    CREATE TABLE [dbo].[Users] (
    	[uname] [varchar] (15) NOT NULL ,
    	[Pwd] [varchar] (25) NOT NULL ,
    	[userRole] [varchar] (25) NOT NULL ,
    )  ON [PRIMARY] 
    GO
    ALTER TABLE [dbo].[Users] WITH NOCHECK ADD 
    	CONSTRAINT [PK_Users] PRIMARY KEY  NONCLUSTERED 
    	(
    		[uname]
    	)  ON [PRIMARY] 
    GO
    
    INSERT INTO Users values('user1','user1','Manager')
    INSERT INTO Users values('user2','user2','Admin')
    INSERT INTO Users values('user3','user3','User')
    GO
    					
  3. Сохраните новый файл под именем Users.sql.
  4. На компьютере, на котором установлен сервер Microsoft SQL Server, откройте данный файл в приложении Query Analyzer. В списке баз данных выберите pubs и запустите данный сценарий. Этот сценарий создает и заполняет таблицу users в базе данных pubs.

Создание страницы Logon.aspx

  1. Добавьте к проекту новую форму Web Forms с именем Logon.aspx.
  2. Откройте страницу Logon.aspx в редакторе и включите режим просмотра HTML-кода.
  3. Скопируйте представленный ниже код и в меню Правка выберите команду Вставить как HTML, чтобы вставить этот код между тегами <form>:
    <h3>
       <font face="Verdana">Logon Page</font>
    </h3>
    <table>
       <tr>
          <td>Email:</td>
          <td><input id="txtUserName" type="text" runat="server"></td>
          <td><ASP:RequiredFieldValidator ControlToValidate="txtUserName"
               Display="Static" ErrorMessage="*" runat="server" 
               ID="vUserName" /></td>
       </tr>
       <tr>
          <td>Password:</td>
          <td><input id="txtUserPass" type="password" runat="server"></td>
          <td><ASP:RequiredFieldValidator ControlToValidate="txtUserPass"
              Display="Static" ErrorMessage="*" runat="server" 
              ID="vUserPass" />
          </td>
       </tr>
       <tr>
          <td>Persistent Cookie:</td>
          <td><ASP:CheckBox id="chkPersistCookie" runat="server" autopostback="false" /></td>
          <td></td>
       </tr>
    </table>
    <input type="submit" Value="Logon" runat="server" ID="cmdLogin"><p></p>
    <asp:Label id="lblMsg" ForeColor="red" Font-Name="Verdana" Font-Size="10" runat="server" />
    						
    Данная форма служит для ввода пользователями своих учетных данных при входе в приложение.
  4. Вернитесь в режим конструктора и сохраните страницу.

Создание обработчика событий, проверяющего учетные данные пользователей

В данном разделе представлен код, который необходимо поместить на страницу кода (Logon.aspx.vb).
  1. Откройте файл Logon.aspx.vb.
  2. Импортируйте нужные пространства имен в файл кода:
    Imports System.Data.SqlClient
    Imports System.Web.Security
    					
  3. Создайте функцию ValidateUser, которая будет проверять учетные данные пользователя по базе данных. Если необходимо, измените строку подключения, чтобы она указывала на нужную базу данных.
    Private Function ValidateUser(ByVal userName As String, ByVal passWord As String) As Boolean
            Dim conn As SqlConnection
            Dim cmd As SqlCommand
            Dim lookupPassword As String
    
            lookupPassword = Nothing
    
            ' Check for an invalid userName.
            ' userName  must not be set to nothing and must be between one and 15 characters.
            If ((userName Is Nothing)) Then
                System.Diagnostics.Trace.WriteLine("[ValidateUser] Input validation of userName failed.")
                Return False
            End If
            If ((userName.Length = 0) Or (userName.Length > 15)) Then
                System.Diagnostics.Trace.WriteLine("[ValidateUser] Input validation of userName failed.")
                Return False
            End If
    
            ' Check for invalid passWord.
            ' passWord must not be set to nothing and must be between one and 25 characters.
            If (passWord Is Nothing) Then
                System.Diagnostics.Trace.WriteLine("[ValidateUser] Input validation of passWord failed.")
                Return False
            End If
            If ((passWord.Length = 0) Or (passWord.Length > 25)) Then
                System.Diagnostics.Trace.WriteLine("[ValidateUser] Input validation of passWord failed.")
                Return False
            End If
    
            Try
                ' Consult with your SQL Server administrator for an appropriate connection
                ' string to use to connect to your local SQL Server.
                conn = New SqlConnection("server=localhost;Integrated Security=SSPI;database=pubs")
                conn.Open()
    
                ' Create SqlCommand to select pwd field from the users table given a supplied userName.
                cmd = New SqlCommand("Select pwd from users where uname=@userName", conn)
                cmd.Parameters.Add("@userName", SqlDbType.VarChar, 25)
                cmd.Parameters("@userName").Value = userName
    
    
                ' Execute command and fetch pwd field into lookupPassword string.
                lookupPassword = cmd.ExecuteScalar()
    
                ' Cleanup command and connection objects.
                cmd.Dispose()
                conn.Dispose()
            Catch ex As Exception
                ' Add error handling here for debugging.
                ' This error message should not be sent back to the caller.
                System.Diagnostics.Trace.WriteLine("[ValidateUser] Exception " & ex.Message)
            End Try
    
            ' If no password found, return false.
            If (lookupPassword Is Nothing) Then
                ' You could write failed login attempts here to the event log for additional security.
                Return False
            End If
    
            ' Compare lookupPassword and input passWord by using a case-sensitive comparison.
            Return (String.Compare(lookupPassword, passWord, False) = 0)
    
    End Function
    					
  4. Следующие методы позволяют обработчику события cmdLogin_ServerClick создать файл «cookie» для проверки подлинности и переадресовать пользователя на соответствующую страницу. Ниже приведены примеры сценариев на основе этих методов. В зависимости от поставленной задачи можно использовать любой из указанных методов.
    • Для автоматического создания файлов «cookie» и перенаправления пользователя на нужную страницу вызовите в обработчике события cmdLogin_ServerClick метод RedirectFromLoginPage:
      Private Sub cmdLogin_ServerClick(ByVal sender As Object, ByVal e As System.EventArgs) _
         Handles cmdLogin.ServerClick
         If ValidateUser(txtUserName.Value,txtUserPass.value) Then
            FormsAuthentication.RedirectFromLoginPage(txtUserName.Value, _
            chkPersistCookie.Checked)
         Else
            Response.Redirect("logon.aspx", True)
         End If
      End Sub
      						
    • Создайте билет проверки подлинности, зашифруйте его, создайте файл «cookie», добавьте его к ответу и переадресуйте пользователя. Данный метод обеспечивает более полный контроль за созданием файлов «cookie». Кроме того, в этом случае вместе с билетом FormsAuthenticationTicket могут быть переданы дополнительные данные.
      Private Sub cmdLogin_ServerClick(ByVal sender As Object, _
         ByVal e As System.EventArgs) Handles cmdLogin.ServerClick
         If Validateuser(txtUserName.Value,txtUserPass.Value) Then
            Dim tkt As FormsAuthenticationTicket
            Dim cookiestr As String
            Dim ck As HttpCookie
      
            tkt = New FormsAuthenticationTicket(1, txtUserName.Value, DateTime.Now(), _
      dateTime.Now.AddMinutes(30), chkPersistCookie.Checked, "your custom data")
            cookiestr = FormsAuthentication.Encrypt(tkt)
            ck = new HttpCookie(FormsAuthentication.FormsCookieName(), cookiestr)
            if (chkPersistCookie.Checked) then ck.Expires=tkt.Expiration 
            ck.Path = FormsAuthentication.FormsCookiePath() 
            Response.Cookies.Add(ck)
      
            Dim strRedirect As String
            strRedirect = Request("ReturnURL")
            If strRedirect <> "" Then
               Response.Redirect(strRedirect, True)
            Else
               strRedirect = "default.aspx"
               Response.Redirect(strRedirect, True)
            End If
         Else
            Response.Redirect("logon.aspx", True)
         End If
      End Sub
      						

Создание страницы Default.aspx

В данном разделе рассматривается создание страницы, на которую пользователи будут перенаправлены после прохождения проверки подлинности. Если пользователь попытается открыть данную страницу без предварительной проверку подлинности, он будет перенаправлен на страницу проверки подлинности.
  1. Переименуйте страницу WebForm1.aspx в Default.aspx и откройте ее в редакторе.
  2. В режиме работы с HTML-кодом поместите следующий код между тегами <form>:
    <input type="submit" Value="SignOut" runat="server" id="cmdSignOut">
    						
    Данная кнопка используется для завершения сеанса проверки подлинности форм.
  3. Вернитесь в режим конструктора и сохраните страницу.
  4. Импортируйте нужные пространства имен в файл кода:
    Imports System.Web.Security
    					
  5. Откройте страницу кода (Default.aspx.vb) и поместите следующий код в обработчик события cmdSignOut_ServerClick:
    Private Sub cmdSignOut_ServerClick(ByVal sender As System.Object, ByVal e As System.EventArgs) _
    Handles cmdSignOut.ServerClick
       FormsAuthentication.SignOut()
       Response.Redirect("logon.aspx", True)
    End Sub
    					
  6. Сохраните и откомпилируйте проект. Теперь приложение готово к работе.

Устранение неполадок

  • При необходимости пароли можно хранить в базе данных в зашифрованном виде. Для этого перед сохранением паролей в базе данных или в файле конфигурации необходимо зашифровать пароли с помощью функции HashPasswordForStoringInConfigFile класса FormsAuthentication.
  • Чтобы упростить в дальнейшем изменение данных о подключении к серверу SQL, можно сохранить эту информацию в файле конфигурации (Web.config).
  • Для предотвращения попыток подбора пароля злоумышленниками может потребоваться дополнительный код. Например, можно изменить программу таким образом, чтобы обрабатывались только две или три попытки входа. Если пользователь не смог зарегистрироваться за указанное число попыток, данному пользователю можно запретить регистрироваться в системе, пока он не обратится в службу технической поддержки. Кроме того, следует добавить соответствующие процедуры обработки ошибок везде, где это необходимо.
  • Поскольку проверка подлинности основывается на использовании файлов «cookie», для защиты файлов «cookie» и передаваемых данных может потребоваться использование протокола SSL (Secure Sockets Layer).
  • Идентификация на основе форм требует, чтобы веб-обозреватели на клиентских компьютерах принимали файлы «cookie».
  • Параметр timeout раздела <authentication> задает промежуток времени, по истечении которого происходит обновление файла «cookie», отвечающего за проверку подлинности. Задайте значение, обеспечивающее более высокую производительность и безопасность.
  • Некоторые прокси-серверы и буферы в Интернете могут кэшировать ответы веб-сервера, содержащие заголовки настройки файлов «cookie», которые затем могут попасть к другим пользователям. Поскольку проверка подлинности на основе форм использует файлы «cookie» для подтверждения подлинности пользователей, это может стать причиной случайной (или преднамеренной) подмены учетной информации пользователя путем получения от прокси-сервера файла «cookie», предназначенного другому пользователю.

Ссылки

За дополнительной информацией о выполнении проверки подлинности на основе форм при хранении имен и паролей пользователей в разделе <credentials> обратитесь к следующей статье ASP.NET QuickStart:
Проверка подлинности на основе форм (эта ссылка может указывать на содержимое полностью или частично на английском языке)
http://samples.gotdotnet.com/quickstart/aspplus/default.aspx?url=/quickstart/aspplus/doc/formsauth.aspx
За информацией о выполнении проверки подлинности на основе форм при хранении имен и паролей пользователей в файле XML (Extensible Markup Language) обратитесь к следующему разделу документации .NET Framework Software Development Kit (SDK):
Проверка подлинности на основе форм с помощью файла пользователя XML (эта ссылка может указывать на содержимое полностью или частично на английском языке)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconcookieauthenticationusinganxmlusersfile.asp
За дополнительной информацией о системе безопасности в приложениях ASP.NET обратитесь к следующему разделу документации .NET Framework SDK:
Система безопасности в приложениях ASP.NET (эта ссылка может указывать на содержимое полностью или частично на английском языке)
http://msdn2.microsoft.com/en-us/library/330a99hc(vs.71).aspx
За дополнительной информацией о пространстве имен System.Web.Security обратитесь к следующему разделу документации .NET Framework SDK:
http://msdn.microsoft.com/library/dotnet/cpref/frlrfsystemwebsecurity.htm
За дополнительной информацией о настройке ASP.NET обратитесь к документации .NET Framework SDK:
Настройка ASP.NET (эта ссылка может указывать на содержимое полностью или частично на английском языке)
http://msdn2.microsoft.com/en-us/library/aa719558(VS.71).aspx

Дополнительная информация о настройке ASP.NET (эта ссылка может указывать на содержимое полностью или частично на английском языке)
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpgrfaspnetconfigurationsections.asp
За информацией о рекомендациях по обеспечению безопасности при использовании ASP.NET обратитесь к следующему документу MSDN:
Проверка подлинности в ASP.NET: рекомендации по обеспечению безопасности (эта ссылка может указывать на содержимое полностью или частично на английском языке)
http://msdn2.microsoft.com/en-us/library/ms978378.aspx
За дополнительной информацией об ASP.NET обратитесь к следующей группе новостей MSDN:
microsoft.public.dotnet.framework.aspnet
За дополнительной информацией обратитесь к следующим книгам:
Esposito, Dino. Building Web Solutions with ASP.NET and ADO.NET. Microsoft Press, 2001.

Howard, Michael and David LeBlanc. Writing Secure Code. Microsoft Press, 2001.

Свойства

Код статьи: 308157 - Последний отзыв: 29 октября 2007 г. - Revision: 8.8
Информация в данной статье относится к следующим продуктам.
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
Ключевые слова: 
kbproductlink kbconfig kbhowtomaster kbsecurity kbweb KB308157

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com