| Украина, Киев |
Безопасность: аутентификация с помощью форм
Страница регистрации при использовании 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, можно программно решать, например, следующие задачи:
- Создание, редактирование и удаление пользователей
- Извлечение списков пользователей со всей подробной информацией, занесенной при создании
