Реализация проверки подлинности на основе форм в приложении ASP.NET с помощью C#.NET

В этой статье показано, как реализовать проверку подлинности на основе форм с помощью базы данных для хранения пользователей. Он ссылается на следующие пространства имен библиотеки классов Microsoft платформа .NET Framework:

  • System.Data.SqlClient
  • System.Web.Security

Исходная версия продукта: ASP.NET
Оригинальный номер базы знаний: 301240

Требования

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

  • Visual Studio .NET
  • Службы IIS версии 5.0 или более поздней
  • SQL Server

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

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

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

В этом разделе показано, как добавить и изменить <authentication> разделы конфигурации и <authorization> , чтобы настроить приложение ASP.NET для использования проверки подлинности на основе форм.

  1. В обозревателе решений откройте файл Web.config.

  2. Измените режим проверки подлинности на Forms.

  3. <Forms> Вставьте тег и заполните соответствующие атрибуты. Скопируйте следующий код и выберите Вставить как 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. В меню Пуск выберите Выполнить, а затем введите Блокнот, чтобы открыть Блокнот.

  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. На SQL Server компьютере откройте Users.sql в анализаторе запросов. В списке баз данных выберите pubs и запустите скрипт. Эта операция создает пример таблицы users и заполняет таблицу в базе данных Pubs для использования с этим примером приложения.

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

  1. Добавьте новую веб-форму в проект с именем 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.cs).

  1. Дважды щелкните Вход , чтобы открыть файл Logon.aspx.cs .

  2. Импортируйте необходимые пространства имен в файл кода программной части:

    using System.Data.SqlClient;
    using System.Web.Security;
    
  3. Создайте ValidateUser функцию для проверки учетных данных пользователя путем поиска в базе данных. Убедитесь, что вы изменили строку так, чтобы она указывала Connection на базу данных.

    private bool ValidateUser( string userName, string passWord )
    {
        SqlConnection conn;
        SqlCommand cmd;
        string lookupPassword = null;
    
        // Check for invalid userName.
        // userName must not be null and must be between 1 and 15 characters.
        if ( ( null == userName ) || ( 0 == userName.Length ) || ( userName.Length > 15 ))
        {
            System.Diagnostics.Trace.WriteLine( "[ValidateUser] Input validation of userName failed." );
            return false;
        }
    
        // Check for invalid passWord.
        // passWord must not be null and must be between 1 and 25 characters.
        if ( ( null == passWord ) || ( 0 == passWord.Length ) || ( passWord.Length > 25 ))
        {
            System.Diagnostics.Trace.WriteLine( "[ValidateUser] Input validation of passWord failed." );
            return false;
        }
    
        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 users table given 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 = (string) cmd.ExecuteScalar();
    
            // Cleanup command and connection objects.
            cmd.Dispose();
            conn.Dispose();
        }
        catch ( Exception ex )
        {
            // 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 );
        }
    
        // If no password found, return false.
        if ( null == lookupPassword )
        {
            // You could write failed login attempts here to event log for additional security.
            return false;
        }
    
        // Compare lookupPassword and input passWord, using a case-sensitive comparison.
        return ( 0 == string.Compare( lookupPassword, passWord, false ));
    }
    
  4. Для создания файла cookie проверки подлинности на основе форм и перенаправления пользователя на соответствующую страницу в событии cmdLogin_ServerClick можно использовать один из двух методов. Пример кода предоставляется для обоих сценариев. Используйте любой из них в соответствии с вашими требованиями.

    • RedirectFromLoginPage Вызовите метод , чтобы автоматически создать файл cookie проверки подлинности форм и перенаправить пользователя на соответствующую страницу в событииcmdLogin_ServerClick:

      private void cmdLogin_ServerClick(object sender, System.EventArgs e)
      {
          if (ValidateUser(txtUserName.Value,txtUserPass.Value))
              FormsAuthentication.RedirectFromLoginPage(txtUserName.Value, chkPersistCookie.Checked);
          else
              Response.Redirect("logon.aspx", true);
      }
      
    • Создайте билет проверки подлинности, зашифруйте его, создайте файл cookie, добавьте его в ответ и перенаправьте пользователя. Эта операция обеспечивает больший контроль над созданием файла cookie. В этом случае можно также включить пользовательские FormsAuthenticationTicket данные вместе с .

      private void cmdLogin_ServerClick(object sender, System.EventArgs e)
      {
          if (ValidateUser(txtUserName.Value,txtUserPass.Value))
          {
              FormsAuthenticationTicket tkt;
              string cookiestr;
              HttpCookie ck;
              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)
                  ck.Expires=tkt.Expiration;
              ck.Path = FormsAuthentication.FormsCookiePath;
              Response.Cookies.Add(ck);
      
              string strRedirect;
              strRedirect = Request["ReturnUrl"];
              if (strRedirect==null)
                  strRedirect = "default.aspx";
              Response.Redirect(strRedirect, true);
          }
          else
              Response.Redirect("logon.aspx", true);
      }
      
  5. Убедитесь, что следующий код добавлен InitializeComponent в метод в коде, который создает веб-форма Designer:

    this.cmdLogin.ServerClick += new System.EventHandler(this.cmdLogin_ServerClick);
    

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

В этом разделе создается тестовая страница, на которую перенаправляются пользователи после проверки подлинности. Если пользователи переходят на эту страницу без предварительного входа в приложение, они перенаправляются на страницу входа.

  1. Переименуйте существующую страницу WebForm1.aspx как Default.aspx и откройте ее в редакторе.

  2. Переключитесь в представление HTML и скопируйте следующий код между <form> тегами:

    <input type="submit" Value="SignOut" runat="server" id="cmdSignOut">
    

    Эта кнопка используется для выхода из сеанса проверки подлинности на основе форм.

  3. Перейдите в режим конструктора и сохраните страницу.

  4. Импортируйте необходимые пространства имен в файл кода программной части:

    using System.Web.Security;
    
  5. Дважды щелкните SignOut, чтобы открыть страницу кода программной части (Default.aspx.cs), и скопируйте следующий код в cmdSignOut_ServerClick обработчик событий:

    private void cmdSignOut_ServerClick(object sender, System.EventArgs e)
    {
        FormsAuthentication.SignOut();
        Response.Redirect("logon.aspx", true);
    }
    
  6. Убедитесь, что следующий код добавлен InitializeComponent в метод в коде, который создает веб-форма Designer:

    this.cmdSignOut.ServerClick += new System.EventHandler(this.cmdSignOut_ServerClick);
    
  7. Сохраните и скомпилируйте проект. Теперь вы можете использовать приложение.

Дополнительные замечания

  • Может потребоваться безопасно хранить пароли в базе данных. Вы можете использовать служебную FormsAuthentication функцию класса с именем HashPasswordForStoringInConfigFile для шифрования паролей перед их сохранением в базе данных или файле конфигурации.

  • Может потребоваться сохранить сведения о подключении SQL в файле конфигурации (Web.config), чтобы при необходимости их можно было легко изменить.

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

  • Так как пользователь идентифицируется на основе файла cookie проверки подлинности, может потребоваться использовать протокол SSL в этом приложении, чтобы никто не мог обмануть файл cookie проверки подлинности и любую другую передаваемую ценную информацию.

  • Для проверки подлинности на основе форм требуется, чтобы клиент принимал или включил файлы cookie в браузере.

  • Параметр времени ожидания раздела конфигурации <authentication> определяет интервал, через который повторно создается файл cookie проверки подлинности. Вы можете выбрать значение, обеспечивающее более высокую производительность и безопасность.

  • Некоторые промежуточные прокси-серверы и кэши в Интернете могут кэшировать ответы веб-сервера, содержащие Set-Cookie заголовки, которые затем возвращаются другому пользователю. Так как для проверки подлинности на основе форм для проверки подлинности пользователей используется файл cookie, это поведение может привести к тому, что пользователи случайно (или намеренно) олицетворяют другого пользователя, получая файл cookie от промежуточного прокси-сервера или кэша, который изначально не предназначался для них.

Ссылки