Опубликован: 13.07.2010 | Уровень: специалист | Доступ: платный
Самостоятельная работа 37:

Безопасность: аутентификация с помощью форм

< Самостоятельная работа 36 || Самостоятельная работа 37: 12345678

Страница регистрации при использовании 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>
                            &nbsp;&nbsp;&nbsp;
                        </td>
                        <td align="right" height="43" style="width: 167px">
                            Имя&nbsp;пользователя:</td>
                        <td>
                            &nbsp;<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>
                            &nbsp;&nbsp;&nbsp;
                        </td>
                        <td align="right" height="43" style="width: 167px">
                            &nbsp;Пароль:</td>
                        <td>
                            &nbsp;<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| !"$&amp;/()=\-?\*]*'>*
                            </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
  • Запустите приложение с любой страницы и введите учетную запись, сохраненную нами ранее в базе данных
User Name: admin
Password: Root&Root
  • С помощью утилиты 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:

  1. Membership - статический класс, имеющий ряд полезных методов управления пользователями
  2. MembershipCreateUserException - исключение, генерируемое ошибкой создания пользователя (например, с уже существующим именем)
  3. MembershipPasswordException - исключение при невозможности извлечения пароля
  4. MembershipUser - объект этого класса содержит всю информацию о пользователе и возвращается методом Membership.GetUser()
  5. MembershipUserCollection - коллекция пользователей, извлекаемая методом Membership.GetAllUsers()
  6. MembershipProvider - базовый класс для поставщиков данных
  7. MembershipProviderCollection - коллекция доступных для приложения поставщиков на данной машине
  8. SqlMembershipProvider - поставщик для работы с базами данных SQL Server
  9. ActiveDirectoryMembershipProvider - поставщик для работы со службой Active Directory
  10. ActiveDirectoryMembershipUser - класс поддержки пользователя, расширенный для работы со службой Active Directory

Используя API Membership, можно программно решать, например, следующие задачи:

  • Создание, редактирование и удаление пользователей
  • Извлечение списков пользователей со всей подробной информацией, занесенной при создании
< Самостоятельная работа 36 || Самостоятельная работа 37: 12345678
Иван Циферблат
Иван Циферблат
Россия, Таганрог, 36, 2000