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

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

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

Упражнение 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, а именно:

  • Comment
  • Email
  • IsApproved
  • LastActivityDate
  • LastLoginDate

Для этого используется статический метод 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 содержит компоненты, которые обеспечивают пользовательский интерфейс и функциональность для выполнения большинства типовых операций членства и безопасности.


Это следующие компоненты:

  1. Login - предоставляет два поля для ввода имени пользователя и пароля, а также кнопку для отправки на проверку удостоверения пользователя. По умолчанию проверка выполняется через API Membership
  2. LoginView - позволяет отображать разные наборы элементов управления для разных категорий пользователей
  3. PasswordRecovery - предоставляет необходимый интерфейс для запроса контрольного ответа и обеспечивает повторную отправку пользователю утраченного пароля через электронную почту
  4. LoginStatus - проверяет состояние аутентификации текущего сеанса и предоставляет страницу регистрации для неаутентифицированных пользователей
  5. LoginName - элемент управления, который в заданном формате отображает имя только того пользователя, который успешно прошел регистрацию
  6. CreateUserWizard - предоставляет многошаговый пользовательский интерфейс для ввода имени, пароля, контрольных вопроса и ответа, адреса элекстронной почты, необходимых при регистрации на сайте
  7. ChangePassword - предоставляет пользовательский интерфейс для смены пароля

Все эти элементы управления по умолчанию настроены на работу с API Membership.

Упражнение 9. Административная страница регистрации на базе элемента управления Login

Этот элемент используется в страницах регистрации и предоставляет для этого весь необходимый интерфейс. С помощью свойств элемента Login можно настраивать стили, задавать необходимые надписи и подсказки. Разработаем страницу регистрации с применением библиотечного элемента управления Login.

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