Китай |
Безопасность: аутентификация с помощью форм
Страница регистрации при использовании Membership
На данном этапе для проверки аутентификации с использованием API Membership и хранилища БД мы воспользуемся страницей регистрации MyLogin.aspx. Ее нужно только немного модифицировать.
- Модифицируйте страницу регистрации MyLogin.aspx, чтобы код стал таким
<%@ Page Language="C#" EnableViewState="false" %> <script runat="server"> protected void LoginAction_Click(object sender, EventArgs e) { this.Validate();// Исполнить валидаторы на сервере if (!this.IsValid)// Оценить флаг достоверности return;// Отправить назад как есть // Извлечь из базы данных и сравнить с введенным if (Membership.ValidateUser(UsernameText.Text, PasswordText.Text)) { // Создать временный cookie-набор (второй параметр false), // записать в него метку аутентификации и перенаправить // на исходную запрошенную страницу или defaultUrl="MyDefault.aspx" // с созданием coockie-набора только на период сеанса FormsAuthentication.RedirectFromLoginPage(UsernameText.Text, false); } else { HtmlGenericControl message = new HtmlGenericControl(); message.InnerHtml = "<h2 style='color: Red'>Неверное имя или пароль!</h2>"; form1.Controls.Add(message); } } </script> <html xmlns="http://www.w3.org/1999/xhtml"> <head id="Head1" runat="server"> <title>Untitled Page</title> </head> <body> <form id="form1" runat="server"> <div style="text-align: center"> <h1>Сегодня <% this.Response.Write(DateTime.Now.ToShortDateString()); %> г.</h1> <h2> Введите свои имя и пароль</h2> <asp:Panel ID="MainPanel" runat="server" BorderColor="Silver" BorderStyle="Ridge" BorderWidth="2px" Height="90px" Width="412px"> <table cellpadding="5" style="width: 100%"> <tr> <td> </td> <td align="right" height="43" style="width: 167px"> Имя пользователя:</td> <td> <asp:TextBox ID="UsernameText" runat="server" /> </td> <td> <asp:RequiredFieldValidator ID="UsernameRequiredValidator" runat="server" ControlToValidate="UsernameText" Display="Dynamic" ErrorMessage='Не заполнено поле "Имя пользователя"' ToolTip="Пустое поле ввода">* </asp:RequiredFieldValidator> <asp:RegularExpressionValidator ID="UsernameValidator" runat="server" ControlToValidate="UsernameText" Display="Dynamic" ErrorMessage="Неверное имя пользователя" ToolTip="Допустимы буквы, цифры, пробелы и подчеркивания" ValidationExpression="[а-яА-Я\w| ]*">* </asp:RegularExpressionValidator> </td> </tr> <tr> <td> </td> <td align="right" height="43" style="width: 167px"> Пароль:</td> <td> <asp:TextBox ID="PasswordText" runat="server" TextMode="Password" /> </td> <td> <asp:RequiredFieldValidator ID="PwdRequiredValidator" runat="server" ControlToValidate="PasswordText" Display="Dynamic" ErrorMessage='Не заполнено поле "Пароль"' ToolTip="Пустое поле ввода">* </asp:RequiredFieldValidator> <asp:RegularExpressionValidator ID="PwdValidator" runat="server" ControlToValidate="PasswordText" Display="Dynamic" ErrorMessage="Неверный пароль" ToolTip="Используются недопустимые символы" ValidationExpression='[а-яА-Я\w| !"$&/()=\-?\*]*'>* </asp:RegularExpressionValidator> </td> </tr> </table> <asp:Button ID="Button1" runat="server" Text="Отправить" OnClick="LoginAction_Click" /> </asp:Panel> <asp:Label ID="lblResult" runat="server" /> </div> <asp:ValidationSummary ID="ValidationSummary1" runat="server" /> </form> </body> </html>Листинг 37.14. Код страницы регистрации MyLogin.aspx
- Запустите приложение с любой страницы и введите учетную запись, сохраненную нами ранее в базе данных
- С помощью утилиты WAT добавьте в хранилище еще несколько пользователей и убедитесь, что аутентификация на основе Membership и хранилища удостоверений в БД работает
При добавлении новых пользователей следует иметь ввиду, что имя пользователя сохраняется в поле UserName реляционной таблицы aspnet_Users и является основой для формирования поля UserId как первичного ключа. Поэтому все пользователи должны иметь уникальные имена и регистр символов не имеет значения.
- В панели Server Explorer установите соединение с базой данных ASPNETDB двойным щелчком указателя мыши на пиктограмме базы
- Для таблиц aspnet_Users и aspnet_Membership выполните команду Show Table Data контекстного меню
После таких действий откроются таблицы aspnet_Users и aspnet_Membership, в которых можно найти информацию о созданных пользователях. Для того, чтобы увидеть структуру таблиц, следует выполнить для них команду Open Table Definition контекстного меню.
Административные страницы управления аутентификацией с использованием API Membership
Интерфейс API Membership включает в себя следующие классы пространства имен System.Web.Security:
- Membership - статический класс, имеющий ряд полезных методов управления пользователями
- MembershipCreateUserException - исключение, генерируемое ошибкой создания пользователя (например, с уже существующим именем)
- MembershipPasswordException - исключение при невозможности извлечения пароля
- MembershipUser - объект этого класса содержит всю информацию о пользователе и возвращается методом Membership.GetUser()
- MembershipUserCollection - коллекция пользователей, извлекаемая методом Membership.GetAllUsers()
- MembershipProvider - базовый класс для поставщиков данных
- MembershipProviderCollection - коллекция доступных для приложения поставщиков на данной машине
- SqlMembershipProvider - поставщик для работы с базами данных SQL Server
- ActiveDirectoryMembershipProvider - поставщик для работы со службой Active Directory
- ActiveDirectoryMembershipUser - класс поддержки пользователя, расширенный для работы со службой Active Directory
Используя API Membership, можно программно решать, например, следующие задачи:
- Создание, редактирование и удаление пользователей
- Извлечение списков пользователей со всей подробной информацией, занесенной при создании