Опубликован: 07.05.2010 | Уровень: для всех | Доступ: платный
Лекция 18:

Безопасность

< Лекция 17 || Лекция 18: 123456789

Извлечение из хранилища списков пользователей

Для получения списка пользователей применяют метод 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" border="1" bordercolor="#0000FF" 
                    width="100%" 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 valign="top" width="50%">
                            Комментарии:</td>
                        <td>
                            <asp:TextBox ID="txtComment" runat="server" TextMode="MultiLine" 
                                Width="100%"></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>

Интерфейсная часть страницы представлена элементом GridView и текстовыми метками, спозиционированными в серверной таблице. Значения параметров DataField элемента GridView представляют собой имена полей таблиц aspnet_Users и aspnet_Membership базы данных

Установка в элементе управления GridView свойства DataKeyNames="UserName" позволяет извлекать значения поля UserName через GridView.SelectedValue, что очень удобно при получении подробностей о конкретном пользователе из коллекции пользователей.

Метод Membership.GetUser() возвращает объект запрошенного пользователя, свойства которого мы отображаем в текстовых элементах, скомпонованных в таблице. Привязка к свойствам объекта пользователя выполняется в обработчике события SelectedIndexChanged элемента управления GridView.

Результат работы страницы GetUsersMembership.aspx будет примерно таким

Конфигурирование поставщика SqlMembershipProvider

Извлечение пароля напрямую через свойство не предусмотрено в классе MembershipUser. Для этого существует метод MembershipUser.GetPassword(), который работает только тогда, когда поставщик SqlMembershipProvider сконфигурирован с параметром enablePasswordRetrieval="true" в конфигурационном файле Web.config.

Наша задача - перенастроить поставщик по умолчанию, создав для этого поставщик того же типа, но с другими настройками. Новый поставщик в той же базе данных будет иметь доступ только к своим данным. Включение параметра enablePasswordRetrieval="true" несовместимо с настройкой passwordFormat="Hashed", а должно иметь значения "Clear" или "Encrypted "

  • Измените конфигурационный файл, чтобы он принял следующий вид
    <?xml version="1.0" encoding="utf-8"?>
    <configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
    	<system.web>
    		<compilation debug="true" />
    		<authentication mode="Forms">
    			<forms
    				name="MyCookieName"
    				loginUrl="MyLogin.aspx"
    				defaultUrl="MyDefault.aspx"
    				protection="All"
    				timeout="20"
    				path="/"
    				requireSSL="false"
    				slidingExpiration="true"
    				cookieless="AutoDetect"
    				domain=""
    				enableCrossAppRedirects="false">
    			</forms>
    		</authentication>
    		<!-- Временно закомментировали, чтобы не требовал регистрации
    		<authorization>
    			<deny users="?"/>
    		</authorization>
    		-->
    		<membership defaultProvider="MyMembershipProvider">
    			<providers>
    				<add name="MyMembershipProvider" connectionStringName="MyMembershipConnString"
    				 enablePasswordReset="true" requiresQuestionAndAnswer="true"
    				 requiresUniqueEmail="false" enablePasswordRetrieval="true" passwordFormat="Clear" 
    				 type="System.Web.Security.SqlMembershipProvider"
    				/>
    			</providers>
    		</membership>
    	</system.web>
    	<connectionStrings>
    		<add name="MyMembershipConnString"
    			connectionString="Data Source=localhost; Initial Catalog=ASPNETDB; user id=sa; password=;"
    		/>
    	</connectionStrings>
    </configuration>
  • Добавьте новых пользователей с помощью нашей административной страницы AddUserMembership.aspx
  • Получите из страницы GetUsersMembership.aspx копию с именем GetUsersMyMembershipProvider.aspx, назначьте ее стартовой и добавьте в интерфейсную часть текстовую метку lblPassword для отображения пароля
  • Добавьте в обработчик события SelectedIndexChanged строку заполнения метки
    lblPassword.Text = currentUser.GetPassword();
< Лекция 17 || Лекция 18: 123456789
Илья Онучин
Илья Онучин
Россия
Igor Chelyadinski
Igor Chelyadinski
Беларусь, Минск, №54, 2013