Реализация проверки подлинности на основе форм в приложении ASP.NET с помощью C#.NET
В этой статье показано, как реализовать проверку подлинности на основе форм с помощью базы данных для хранения пользователей. Он ссылается на следующие пространства имен библиотеки классов Microsoft платформа .NET Framework:
System.Data.SqlClient
System.Web.Security
Исходная версия продукта: ASP.NET
Исходный номер базы знаний: 301240
Требования
В следующем списке описаны рекомендуемые аппаратные средства, программное обеспечение, сетевая инфраструктура и пакеты обновления.
- Visual Studio .NET
- службы IIS (IIS) версии 5.0 или более поздней
- SQL Server
Создание приложения ASP.NET с помощью C# .NET
- Откройте Visual Studio .NET.
- Создайте веб-приложение ASP.NET и укажите имя и расположение.
Настройка параметров безопасности в файле конфигурации Web.config
В этом разделе показано, как добавить и изменить <authentication>
<authorization>
разделы конфигурации, чтобы настроить приложение ASP.NET для использования проверки подлинности на основе форм.
В Обозреватель решений откройте файл web.config.
Измените режим проверки подлинности на Forms.
<Forms>
Вставьте тег и заполните соответствующие атрибуты. Скопируйте следующий код и нажмите кнопку "Вставить как HTML " в меню "Изменить ", чтобы вставить код в<authentication>
разделе файла:<authentication mode="Forms"> <forms name=".ASPXFORMSDEMO" loginUrl="logon.aspx" protection="All" path="/" timeout="30" /> </authentication>
Запретить доступ к анонимному пользователю в
<authorization>
разделе следующим образом:<authorization> <deny users ="?" /> <allow users = "*" /> </authorization>
Создание примера таблицы базы данных для хранения сведений о пользователях
В этом разделе показано, как создать образец базы данных для хранения имени пользователя, пароля и роли для пользователей. Вам потребуется столбец роли, если вы хотите хранить роли пользователей в базе данных и реализовать безопасность на основе ролей.
В меню "Пуск" выберите "Запустить", а затем введите блокнот, чтобы открыть блокнот.
Выделите следующий код скрипта 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
Сохраните файл как Users.sql.
На компьютере SQL Server откройте Users.sql в анализаторе запросов. В списке баз данных выберите пабы и запустите скрипт. Эта операция создает пример таблицы пользователей и заполняет таблицу в базе данных Pubs для использования с этим примером приложения.
Создание страницы Logon.aspx
Добавьте новую веб-форму в проект с именем Logon.aspx.
Откройте страницу Logon.aspx в редакторе и перейдите в режим HTML.
Скопируйте следующий код и используйте параметр 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" />
Эта веб-форма используется для представления формы входа пользователям, чтобы они могли указать имя пользователя и пароль для входа в приложение.
Дополнительные сведения см. в разделе "Класс RequiredFieldValidator".
Перейдите в режим конструктора и сохраните страницу.
Код обработчика событий, чтобы проверить учетные данные пользователя
В этом разделе представлен код, помещенный на страницу программной части (Logon.aspx.cs).
Дважды щелкните вход , чтобы открыть файл Logon.aspx.cs .
Импортируйте необходимые пространства имен в файл кода программной части:
using System.Data.SqlClient; using System.Web.Security;
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 )); }
Вы можете использовать один из двух методов для создания файла 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); }
Убедитесь, что следующий код добавляется в
InitializeComponent
метод в коде, который создает конструктор веб-форм:this.cmdLogin.ServerClick += new System.EventHandler(this.cmdLogin_ServerClick);
Создание страницы Default.aspx
В этом разделе создается тестовая страница, на которую перенаправляются пользователи после проверки подлинности. Если пользователи переходят на эту страницу без первого входа в приложение, они перенаправляются на страницу входа.
Переименуйте существующую страницу WebForm1.aspx как Default.aspx и откройте ее в редакторе.
Перейдите в html-представление и скопируйте следующий код между тегами
<form>
:<input type="submit" Value="SignOut" runat="server" id="cmdSignOut">
Эта кнопка используется для выхода из сеанса проверки подлинности форм.
Перейдите в режим конструктора и сохраните страницу.
Импортируйте необходимые пространства имен в файл кода программной части:
using System.Web.Security;
Дважды щелкните signOut , чтобы открыть страницу программной части (Default.aspx.cs) и скопируйте следующий код в
cmdSignOut_ServerClick
обработчик событий:private void cmdSignOut_ServerClick(object sender, System.EventArgs e) { FormsAuthentication.SignOut(); Response.Redirect("logon.aspx", true); }
Убедитесь, что следующий код добавляется в
InitializeComponent
метод в коде, который создает конструктор веб-форм:this.cmdSignOut.ServerClick += new System.EventHandler(this.cmdSignOut_ServerClick);
Сохраните и скомпилируйте проект. Теперь можно использовать приложение.
Дополнительные примечания
Вы можете безопасно хранить пароли в базе данных. Вы можете использовать служебную
FormsAuthentication
функцию класса с именемHashPasswordForStoringInConfigFile
для шифрования паролей перед их хранением в базе данных или файле конфигурации.Возможно, потребуется сохранить сведения о подключении SQL в файле конфигурации (Web.config), чтобы при необходимости можно было легко изменить его.
Возможно, вы можете добавить код, чтобы предотвратить хакеров, которые пытаются использовать различные сочетания паролей при входе. Например, можно включить логику, которая принимает только две или три попытки входа. Если пользователи не могут войти в некоторые попытки, может потребоваться установить флаг в базе данных, чтобы не разрешить им войти, пока пользователи не смогут повторно включить свои учетные записи, перейдя на другую страницу или вызвав строку поддержки. Кроме того, необходимо добавить соответствующую обработку ошибок везде, где это необходимо.
Так как пользователь определяется на основе файла cookie проверки подлинности, вы можете использовать протокол SSL для этого приложения, чтобы никто не мог обмануть файл cookie проверки подлинности и любую другую ценную информацию, передаваемую.
Для проверки подлинности на основе форм требуется, чтобы клиент принял или включите файлы cookie в браузере.
Параметр
<authentication>
времени ожидания раздела конфигурации определяет интервал, с помощью которого создается файл cookie проверки подлинности. Вы можете выбрать значение, которое обеспечивает лучшую производительность и безопасность.Некоторые промежуточные прокси-серверы и кэши в Интернете могут кэшировать ответы веб-сервера, содержащие
Set-Cookie
заголовки, которые затем возвращаются другому пользователю. Так как проверка подлинности на основе форм использует файл cookie для проверки подлинности пользователей, это поведение может привести к случайному (или намеренно) олицетворение другого пользователя путем получения файла cookie от промежуточного прокси-сервера или кэша, который изначально не предназначен для них.