Реализация проверки подлинности на основе форм в приложении 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
- Откройте 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 и запустите скрипт. Эта операция создает пример таблицы users и заполняет таблицу в базе данных 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" />
Эта веб-форма используется для предоставления пользователям формы входа, чтобы они могли указать свое имя пользователя и пароль для входа в приложение.
Перейдите в режим конструктора и сохраните страницу.
Код обработчика событий таким образом, чтобы он проверял учетные данные пользователя
В этом разделе представлен код, помещенный на страницу кода программной части (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
в метод в коде, который создает веб-форма Designer: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
в метод в коде, который создает веб-форма Designer:this.cmdSignOut.ServerClick += new System.EventHandler(this.cmdSignOut_ServerClick);
Сохраните и скомпилируйте проект. Теперь вы можете использовать приложение.
Дополнительные замечания
Может потребоваться безопасно хранить пароли в базе данных. Вы можете использовать служебную
FormsAuthentication
функцию класса с именемHashPasswordForStoringInConfigFile
для шифрования паролей перед их сохранением в базе данных или файле конфигурации.Может потребоваться сохранить сведения о подключении SQL в файле конфигурации (Web.config), чтобы при необходимости их можно было легко изменить.
Вы можете добавить код, чтобы предотвратить вход злоумышленников, которые пытаются использовать различные сочетания паролей. Например, можно включить логику, которая принимает только две или три попытки входа. Если пользователям не удается войти в систему при некоторых попытках, может потребоваться установить в базе данных флаг, чтобы запретить им войти в систему, пока пользователи не активируют свои учетные записи повторно, перейдя на другую страницу или позвонив в службу поддержки. Кроме того, при необходимости следует добавлять соответствующую обработку ошибок.
Так как пользователь идентифицируется на основе файла cookie проверки подлинности, может потребоваться использовать протокол SSL в этом приложении, чтобы никто не мог обмануть файл cookie проверки подлинности и любую другую передаваемую ценную информацию.
Для проверки подлинности на основе форм требуется, чтобы клиент принимал или включил файлы cookie в браузере.
Параметр времени ожидания раздела конфигурации
<authentication>
определяет интервал, через который повторно создается файл cookie проверки подлинности. Вы можете выбрать значение, обеспечивающее более высокую производительность и безопасность.Некоторые промежуточные прокси-серверы и кэши в Интернете могут кэшировать ответы веб-сервера, содержащие
Set-Cookie
заголовки, которые затем возвращаются другому пользователю. Так как для проверки подлинности на основе форм для проверки подлинности пользователей используется файл cookie, это поведение может привести к тому, что пользователи случайно (или намеренно) олицетворяют другого пользователя, получая файл cookie от промежуточного прокси-сервера или кэша, который изначально не предназначался для них.
Ссылки
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по