Китай |
Безопасность: аутентификация с помощью форм
Упражнение 7. Административная страница извлечения списков пользователей из БД
Для получения списка пользователей применяют метод Membership.GetAllUsers(), а для извлечения конкретного пользователя - метод Membership.GetUser().
Рассмотрим пример, в котором будем использовать элемент GridView для представления пользователей в виде таблицы.
- Добавьте к проекту страницу GetUsersMembership.aspx без файла отделенного кода и назначьте ее стартовой
- Заполните страницу следующим кодом
<%@ Page Language="C#" EnableViewState="false" %> <script runat="server"> // Вынесли поле класса для видимости в обработчиках MembershipUserCollection myUsers = new MembershipUserCollection(); protected void Page_Load(object sender, EventArgs e) { // Скрываем таблицу деталей tableDetails.Visible = false; lblUser.Visible = false; if (checkUser.Checked) { // Извлекаем одного пользователя if (txtUser.Text.Length == 0) { lblUsersList.Text = "Введите имя пользователя"; return; } try // Попытка { string user = Server.HtmlEncode(txtUser.Text); myUsers = new MembershipUserCollection(); myUsers.Add(Membership.GetUser(user)); } catch // Откат { lblUsersList.Text = "Пользователь не найден"; return; } } else { // Извлекаем всех пользователей myUsers = Membership.GetAllUsers(); } // Подключаем к сетке извлеченную информации и наполняем элемент UsersGridView.DataSource = myUsers; UsersGridView.DataBind(); } // Обработчик щелчков на ссылки столбца отображения деталей protected void UsersGridView_SelectedIndexChanged(object sender, EventArgs e) { if (UsersGridView.SelectedIndex >= 0) { // Заполняем интерфейсные элементы отображаемой информацией, // адресуясь к конкретному пользователю по ключевому имени, // заданному параметром DataKeyNames="UserName" элемента GridView MembershipUser currentUser = myUsers[(string)UsersGridView.SelectedValue]; lblUserName.Text = currentUser.UserName; lblEmail.Text = currentUser.Email; lblPasswordQuestion.Text = currentUser.PasswordQuestion; lblLastLoginDate.Text = currentUser.LastLoginDate.ToLongDateString(); txtComment.Text = currentUser.Comment; checkIsApproved.Checked = currentUser.IsApproved; checkIsLockedOut.Checked = currentUser.IsLockedOut; // Включаем видимость таблицы деталей tableDetails.Visible = true; lblUser.Visible = true; } } </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Untitled Page</title> </head> <body> <form id="form1" runat="server"> <div> <h2> <asp:Label ID="lblUsersList" runat="server" Font-Bold="true" Text="Список зарегистрированных пользователей"></asp:Label> </h2> <p>Конкретный пользователь: <asp:CheckBox ID="checkUser" runat="server" /> <asp:TextBox ID="txtUser" runat="server"></asp:TextBox> <asp:Button ID="btnUser" runat="server" Text="Получить" /></p> <asp:GridView ID="UsersGridView" runat="server" DataKeyNames="UserName" AutoGenerateColumns="False" OnSelectedIndexChanged="UsersGridView_SelectedIndexChanged"> <Columns> <asp:BoundField DataField="UserName" HeaderText="Имя" /> <asp:BoundField DataField="Email" HeaderText="email" /> <asp:BoundField DataField="CreationDate" HeaderText="Создан" /> <asp:CommandField ShowSelectButton="True" HeaderText="Детали" SelectText="Показать" /> </Columns> </asp:GridView> <h2> <asp:Label ID="lblUser" runat="server" Text="Подробности для выделенного пользователя" Visible="False" Font-Bold="true"></asp:Label> </h2> <table id="tableDetails" bordercolor="#0000FF" runat="server"> <tr> <td width="50%"> Пользователь:</td> <td> <asp:Label ID="lblUserName" runat="server"></asp:Label></td> </tr> <tr> <td width="50%"> email:</td> <td> <asp:Label ID="lblEmail" runat="server"></asp:Label></td> </tr> <tr> <td width="50%"> Контрольный вопрос:</td> <td> <asp:Label ID="lblPasswordQuestion" runat="server"></asp:Label></td> </tr> <tr> <td width="50%"> Дата последней регистрации:</td> <td> <asp:Label ID="lblLastLoginDate" runat="server"></asp:Label></td> </tr> <tr> <td width="50%"> Комментарии:</td> <td> <asp:TextBox ID="txtComment" runat="server" TextMode="MultiLine" ></asp:TextBox></td> </tr> <tr> <td width="50%"> Проверенный:</td> <td> <asp:CheckBox ID="checkIsApproved" runat="server" /></td> </tr> <tr> <td width="50%"> Заблокирован:</td> <td> <asp:CheckBox ID="checkIsLockedOut" runat="server" /></td> </tr> </table> </div> </form> </body> </html>Листинг 37.17. Админ. страница GetUsersMembership.aspx для извлечения пользователей из БД
Интерфейсная часть страницы представлена элементом GridView и текстовыми метками, спозиционированными в серверной таблице. Значения параметров DataField элемента GridView представляют собой имена полей таблиц aspnet_Users и aspnet_Membership базы данных
Установка в элементе управления GridView свойства DataKeyNames="UserName" позволяет извлекать значения поля UserName через GridView.SelectedValue, что очень удобно при получении подробностей о конкретном пользователе из коллекции пользователей.
Метод Membership. GetUser() возвращает объект запрошенного пользователя, свойства которого мы отображаем в текстовых элементах, скомпонованных в таблице. Привязка к свойствам объекта пользователя выполняется в обработчике события SelectedIndexChanged элемента управления GridView.
Результат работы страницы GetUsersMembership.aspx будет примерно таким
Упражнение 8. Административная страница обновления пользователей в БД
Если у нас есть экземпляр класса MembershipUser, то мы можем обновить его свойства, имеющие аксессор set, а именно:
Для этого используется статический метод Membership. UpdateUser().
- Получите из страницы GetUsersMembership.aspx копию с именем UpdateUserMembership.aspx
- Скорректируйте страницу UpdateUserMembership.aspx, чтобы обновляемые параметры таблицы деталей размещались в текстовых полях
- Закрепите за полем txtEmail элементы проверки достоверности RequiredFieldValidator и RegularExpressionValidator
Окончательный код страницы UpdateUserMembership.aspx будет таким
<%@ Page Language="C#" EnableViewState="false" %> <%@ Import Namespace="System.Web.Security" %> <script runat="server"> // Вынесли поле для видимости в обработчиках MembershipUserCollection myUsers = new MembershipUserCollection(); protected void Page_Load(object sender, EventArgs e) { // Скрываем таблицу деталей tableDetails.Visible = false; lblUser.Visible = false; // Извлекаем всех пользователей myUsers = Membership.GetAllUsers(); // Подключаем к сетке извлеченную информации и наполняем элемент UsersGridView.DataSource = myUsers; UsersGridView.DataBind(); } // Обработчик щелчков на ссылки столбца отображения деталей protected void UsersGridView_SelectedIndexChanged(object sender, EventArgs e) { if (UsersGridView.SelectedIndex >= 0) { // Заполняем интерфейсные элементы отображаемой информацией, // адресуясь к конкретному пользователю по ключевому имени, // заданному параметром DataKeyNames="UserName" элемента GridView MembershipUser currentUser = myUsers[(string)UsersGridView.SelectedValue]; lblUserName.Text = currentUser.UserName; txtEmail.Text = currentUser.Email; lblPasswordQuestion.Text = currentUser.PasswordQuestion; lblLastLoginDate.Text = currentUser.LastLoginDate.ToLongDateString(); txtComment.Text = currentUser.Comment; checkIsApproved.Checked = currentUser.IsApproved; checkIsLockedOut.Checked = currentUser.IsLockedOut; // Включаем видимость таблицы деталей tableDetails.Visible = true; lblUser.Visible = true; } } protected void btnUpdate_Click(object sender, EventArgs e) { if (UsersGridView.SelectedIndex >= 0) { // Адресуемся к выделенному пользователю MembershipUser currentUser = myUsers[(string)UsersGridView.SelectedValue]; // Избавляемся от возможных управляющих символов // в пользовательском вводе currentUser.Email = Server.HtmlEncode(txtEmail.Text); currentUser.Comment = Server.HtmlEncode(txtComment.Text); currentUser.IsApproved = checkIsApproved.Checked; // Сбрасываем в базу данных Membership.UpdateUser(currentUser); // Обновить содержимое GridView из БД, поскольку // этот обработчик выполнится после Page_Load myUsers = Membership.GetAllUsers();// Извлекаем пользователей UsersGridView.DataBind(); } } </script> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Untitled Page</title> </head> <body> <form id="form1" runat="server"> <div> <h2> <asp:Label ID="lblUsersList" runat="server" Font-Bold="true" Text="Список зарегистрированных пользователей"></asp:Label> </h2> <asp:GridView ID="UsersGridView" runat="server" DataKeyNames="UserName" AutoGenerateColumns="False" OnSelectedIndexChanged="UsersGridView_SelectedIndexChanged"> <Columns> <asp:BoundField DataField="UserName" HeaderText="Имя" /> <asp:BoundField DataField="Email" HeaderText="email" /> <asp:BoundField DataField="CreationDate" HeaderText="Создан" /> <asp:CommandField ShowSelectButton="True" HeaderText="Детали" SelectText="Показать" /> </Columns> </asp:GridView> <h2> <asp:Label ID="lblUser" runat="server" Text="Подробности для выделенного пользователя" Visible="False" Font-Bold="true"></asp:Label> </h2> <table id="tableDetails" bordercolor="#0000FF" runat="server"> <tr> <td width="50%"> Пользователь:</td> <td> <asp:Label ID="lblUserName" runat="server"></asp:Label></td> </tr> <tr> <td width="50%"> <font>email:</font></td> <td> <asp:TextBox ID="txtEmail" runat="server"> </asp:TextBox> <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="txtEmail" Display="Dynamic">* </asp:RequiredFieldValidator> <asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server" ControlToValidate="txtEmail" Display="Dynamic" ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*">* </asp:RegularExpressionValidator></td> </tr> <tr> <td width="50%"> Контрольный вопрос:</td> <td> <asp:Label ID="lblPasswordQuestion" runat="server"></asp:Label></td> </tr> <tr> <td width="50%"> Дата последней регистрации:</td> <td> <asp:Label ID="lblLastLoginDate" runat="server"></asp:Label></td> </tr> <tr> <td width="50%"> <font>Комментарии:</font></td> <td> <asp:TextBox ID="txtComment" runat="server" TextMode="MultiLine" ></asp:TextBox></td> </tr> <tr> <td width="50%"> <font>Проверенный:</font></td> <td> <asp:CheckBox ID="checkIsApproved" runat="server" /></td> </tr> <tr> <td width="50%"> Заблокирован:</td> <td> <asp:CheckBox ID="checkIsLockedOut" runat="server" /></td> </tr> <tr> <td colspan="2" align="center"> <asp:Button ID="btnUpdate" runat="server" Text="Обновить" OnClick="btnUpdate_Click" /></td> </tr> </table> </div> </form> </body> </html>Листинг 37.18. Код страницы UpdateUserMembership.aspx
Элементы управления вкладки Login
Вкладка Login панели Toolbox содержит компоненты, которые обеспечивают пользовательский интерфейс и функциональность для выполнения большинства типовых операций членства и безопасности.
Это следующие компоненты:
- Login - предоставляет два поля для ввода имени пользователя и пароля, а также кнопку для отправки на проверку удостоверения пользователя. По умолчанию проверка выполняется через API Membership
- LoginView - позволяет отображать разные наборы элементов управления для разных категорий пользователей
- PasswordRecovery - предоставляет необходимый интерфейс для запроса контрольного ответа и обеспечивает повторную отправку пользователю утраченного пароля через электронную почту
- LoginStatus - проверяет состояние аутентификации текущего сеанса и предоставляет страницу регистрации для неаутентифицированных пользователей
- LoginName - элемент управления, который в заданном формате отображает имя только того пользователя, который успешно прошел регистрацию
- CreateUserWizard - предоставляет многошаговый пользовательский интерфейс для ввода имени, пароля, контрольных вопроса и ответа, адреса элекстронной почты, необходимых при регистрации на сайте
- ChangePassword - предоставляет пользовательский интерфейс для смены пароля
Все эти элементы управления по умолчанию настроены на работу с API Membership.
Упражнение 9. Административная страница регистрации на базе элемента управления Login
Этот элемент используется в страницах регистрации и предоставляет для этого весь необходимый интерфейс. С помощью свойств элемента Login можно настраивать стили, задавать необходимые надписи и подсказки. Разработаем страницу регистрации с применением библиотечного элемента управления Login.