В настоящее время вы работаете в автономном режиме; ожидается повторное подключение к Интернету

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

Данная статья была ранее опубликована под номером 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]GOCREATE TABLE [dbo].[Users] (	[uname] [varchar] (15) NOT NULL ,	[Pwd] [varchar] (25) NOT NULL ,	[userRole] [varchar] (25) NOT NULL ,)  ON [PRIMARY] GOALTER TABLE [dbo].[Users] WITH NOCHECK ADD 	CONSTRAINT [PK_Users] PRIMARY KEY  NONCLUSTERED 	(		[uname]	)  ON [PRIMARY] GOINSERT 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.SqlClientImports 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 IfEnd 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 IfEnd 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: За дополнительной информацией о настройке 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: За дополнительной информацией обратитесь к следующим книгам:
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 — последний просмотр: 10/29/2007 14:57:19 — редакция: 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
Отзывы и предложения