| Украина, Киев |
Безопасность: аутентификация с помощью форм
Упражнение 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.


