Россия |
Безопасность
Извлечение из хранилища списков пользователей
Для получения списка пользователей применяют метод 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();