Создание учетных записей пользователей (VB)

Скотт Митчелл

Примечание

С момента написания этой статьи поставщики членства ASP.NET были заменены ASP.NET Identity. Мы настоятельно рекомендуем обновить приложения для использования платформы ASP.NET Identity , а не поставщиков членства, которые были представлены на момент написания этой статьи. ASP.NET Identity имеет ряд преимуществ по сравнению с системой членства ASP.NET, в том числе :

  • более высокая производительность;
  • Улучшенная расширяемость и тестируемость
  • Поддержка OAuth, OpenID Connect и двухфакторной проверки подлинности
  • Поддержка удостоверений на основе утверждений
  • Улучшенное взаимодействие с ASP.Net Core

Скачать код или скачать PDF-файл

В этом руководстве мы рассмотрим использование платформы членства (через SqlMembershipProvider) для создания новых учетных записей пользователей. Мы посмотрим, как создавать новых пользователей программными средствами и с помощью ASP. Встроенный элемент управления CreateUserWizard в NET.

Введение

В предыдущем руководстве мы установили схему служб приложений в базу данных, которая добавила таблицы, представления и хранимые процедуры, необходимые SqlMembershipProvider для и SqlRoleProvider. Это создало инфраструктуру, необходимую для оставшейся части учебников в этой серии. В этом руководстве мы рассмотрим использование платформы членства (с помощью SqlMembershipProvider) для создания новых учетных записей пользователей. Мы посмотрим, как создавать новых пользователей программными средствами и с помощью ASP. Встроенный элемент управления CreateUserWizard в NET.

В дополнение к изучению создания учетных записей пользователей нам также потребуется обновить демонстрационный веб-сайт, который мы впервые создали в учебнике Обзор проверки подлинности на основе форм . В нашем демонстрационном веб-приложении есть страница входа, которая проверяет учетные данные пользователей на соответствие жестко заданным парам имени пользователя и пароля. Кроме того, включает код, который создает пользовательские IPrincipal объекты и IIdentity для пользователей, Global.asax прошедших проверку подлинности. Мы обновим страницу входа, чтобы проверить учетные данные пользователей на платформе членства и удалить пользовательскую логику субъекта и удостоверения.

Приступим к работе!

Контрольный список для проверки подлинности на основе форм и членства

Прежде чем приступить к работе с платформой членства, давайте рассмотрим важные шаги, которые мы предприняли для достижения этой точки. При использовании платформы членства с SqlMembershipProvider в сценарии проверки подлинности на основе форм перед реализацией функций членства в веб-приложении необходимо выполнить следующие действия:

  1. Включите проверку подлинности на основе форм. Как мы говорили в обзоре проверки подлинности с помощью форм, проверка подлинности с помощью форм включается путем изменения Web.config и установки <authentication> атрибута mode элемента в значение Forms. Если включена проверка подлинности с помощью форм, каждый входящий запрос проверяется на наличие запроса на проверку подлинности с помощью форм, который идентифицирует инициатор запроса.
  2. Добавьте схему служб приложений в соответствующую базу данных. При использовании SqlMembershipProvider необходимо установить схему служб приложений в базу данных. Обычно эта схема добавляется в ту же базу данных, в которой хранится модель данных приложения. В руководствеСоздание схемы членства в SQL Server рассматривается использование aspnet_regsql.exe средства для этого.
  3. Настройте параметры веб-приложения для ссылки на базу данных из шага 2. В учебнике Создание схемы членства в SQL Server показано два способа настройки веб-приложения таким образом, чтобы SqlMembershipProvider он использовал базу данных, выбранную на шаге 2: путем изменения LocalSqlServer имени строки подключения или путем добавления нового зарегистрированного поставщика в список поставщиков платформы членства и настройки нового поставщика для использования базы данных из шага 2.

При создании веб-приложения, использующего SqlMembershipProvider проверку подлинности на основе форм и , необходимо выполнить эти три шага перед использованием Membership класса или ASP.NET веб-элементов управления Login. Так как мы уже выполнили эти действия в предыдущих руководствах, мы готовы приступить к использованию платформы членства!

Шаг 1. Добавление новых страниц ASP.NET

В этом руководстве и в следующих трех мы рассмотрим различные функции и возможности, связанные с членством. Нам потребуется серия ASP.NET страниц для реализации тем, рассмотренных в этих руководствах. Давайте создадим эти страницы, а затем создадим файл (Web.sitemap)карты сайта .

Начните с создания в проекте папки с именем Membership. Затем добавьте в папку Membership пять новых страниц ASP.NET, связывая каждую страницу со страницей Site.master master. Назовите страницы:

  • CreatingUserAccounts.aspx
  • UserBasedAuthorization.aspx
  • EnhancedCreateUserWizard.aspx
  • AdditionalUserInfo.aspx
  • Guestbook.aspx

На этом этапе Обозреватель решения проекта должен выглядеть примерно так, как на снимке экрана, показанном на рисунке 1.

В папку членства добавлены пять новых страниц

Рис. 1. В папку Membership добавлены пять новых страниц (щелкните для просмотра полноразмерного изображения)

На этом этапе каждая страница должна иметь два элемента управления Контентом, по одному для каждого из master страницы ContentPlaceHolders: MainContent и LoginContent.

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent"
Runat="Server"> 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="LoginContent"
Runat="Server"> 
</asp:Content>

Помните, что LoginContent разметка ContentPlaceHolder по умолчанию отображает ссылку для входа на сайт или выхода из нее в зависимости от того, прошел ли пользователь проверку подлинности. Однако наличие элемента управления Содержимое Content2 переопределяет разметку страницы master по умолчанию. Как мы говорили в руководстве Обзор проверки подлинности с помощью форм, это полезно на страницах, где мы не хотим отображать параметры, связанные с входом, в левом столбце.

Однако для этих пяти страниц мы хотим показать разметку страницы master по умолчанию для LoginContent ContentPlaceHolder. Поэтому удалите декларативную разметку для элемента управления Содержимое Content2 . После этого каждая из пяти страниц должна содержать только один элемент управления Контент.

Шаг 2. Создание карты сайта

Все, кроме самых тривиальных веб-сайтов, должны реализовать некоторую форму навигационного пользовательского интерфейса. Пользовательский интерфейс навигации может быть простым списком ссылок на различные разделы сайта. Кроме того, эти ссылки можно упорядочить в меню или в виде дерева. Как разработчики страниц, создание навигационного пользовательского интерфейса составляет лишь половину истории. Нам также нужны некоторые средства для определения логической структуры сайта в поддерживаемом и обновляемом режиме. По мере добавления новых страниц или удаления существующих страниц мы хотим иметь возможность обновить один источник — карту сайта — и отразить эти изменения в пользовательском интерфейсе навигации сайта.

Эти две задачи — определение карты сайта и реализация навигационного пользовательского интерфейса на основе карты сайта — легко выполнить благодаря платформе "Карта сайта" и веб-элементам управления навигации, добавленным в ASP.NET версии 2.0. Платформа "Карта сайта" позволяет разработчику определить карту сайта, а затем получить к ней доступ через программный API ( SiteMap класс ). Встроенные веб-элементы управления навигации включают элементы управления Menu, TreeView и SiteMapPath.

Как и платформы членства и ролей, платформа карты сайтов строится на основе модели поставщика. Задача класса поставщика карты сайта заключается в создании структуры в памяти, используемой классом SiteMap , из постоянного хранилища данных, такого как XML-файл или таблица базы данных. Платформа .NET Framework поставляется с поставщиком карты сайта по умолчанию, который считывает данные карты сайта из XML-файла (XmlSiteMapProvider), и это поставщик, который мы будем использовать в этом руководстве. Некоторые альтернативные реализации поставщика карты сайта см. в разделе Дополнительные сведения в конце этого руководства.

Поставщик карты сайта по умолчанию ожидает, что в корневом каталоге будет существовать ПРАВИЛЬНО отформатированный XML-файл с именем Web.sitemap . Так как мы используем этот поставщик по умолчанию, необходимо добавить такой файл и определить структуру карты сайта в соответствующем формате XML. Чтобы добавить файл, щелкните правой кнопкой мыши имя проекта в Обозреватель решения и выберите Добавить новый элемент. В диалоговом окне добавьте файл типа Карта сайта с именем Web.sitemap.

Добавление файла с именем Web.sitemap в корневой каталог проекта

Рис. 2. Добавление файла с именем Web.sitemap в корневой каталог проекта (щелкните для просмотра полноразмерного изображения)

Xml-файл карты сайта определяет структуру веб-сайта в виде иерархии. Эта иерархическая связь смоделирована в XML-файле через происхождение <siteMapNode> элементов. Должен Web.sitemap начинаться с родительского <siteMap> узла, который имеет ровно один <siteMapNode> дочерний узел. Этот элемент верхнего уровня <siteMapNode> представляет корень иерархии и может иметь произвольное количество узлов-потомков. Каждый <siteMapNode> элемент должен содержать title атрибут и при необходимости может включать url атрибуты и description , среди прочего; каждый непустой url атрибут должен быть уникальным.

Введите следующий XML-код в Web.sitemap файл:

<?xml version="1.0" encoding="utf-8" ?> 
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0"> 
 <siteMapNode url="~/Default.aspx" title="Home"> 
 <siteMapNode title="Membership">
 <siteMapNode url="~/Membership/CreatingUserAccounts.aspx" title="Creating User Accounts" /> 
 <siteMapNode url="~/Membership/UserBasedAuthorization.aspx" title="User-Based Authorization" /> 
 <siteMapNode url="~/Membership/Guestbook.aspx" title="Storing Additional User Information" /> 
 </siteMapNode> 
 </siteMapNode> 
</siteMap>

Приведенная выше разметка карты сайта определяет иерархию, показанную на рис. 3.

Карта сайта представляет иерархическую структуру навигации

Рис. 3. Карта сайта представляет иерархическую структуру навигации (щелкните для просмотра полноразмерного изображения)

Шаг 3. Обновление главной страницы для включения навигационного пользовательского интерфейса

ASP.NET включает ряд веб-элементов управления, связанных с навигацией, для разработки пользовательского интерфейса. К ним относятся элементы управления Menu, TreeView и SiteMapPath. Элементы управления Menu и TreeView отображают структуру карты сайта в меню или дереве соответственно, тогда как SiteMapPath отображает навигацию, показывающую текущий узел, а также его предков. Данные карты сайта могут быть привязаны к другим веб-элементам управления данными с помощью SiteMapDataSource и доступны программным способом SiteMap через класс .

Так как тщательное обсуждение платформы "Карта сайта" и элементов управления навигацией выходит за рамки область этой серии учебников, вместо того чтобы тратить время на создание собственного навигационного пользовательского интерфейса, давайте вместо этого заимствуем тот, который использовался в моей работе с данными в серии учебников ASP.NET 2.0, в котором элемент управления Repeater используется для отображения двух глубоких маркированных ссылок навигации. Как показано на рис. 4.

Чтобы создать этот интерфейс, добавьте следующую декларативную разметку в Site.master левый столбец страницы master, в котором будет показан текст TODO: Menu... в настоящее время находится.

<ul> 
 <li> 
 <asp:HyperLink runat="server" ID="lnkHome" NavigateUrl="~/Default.aspx">Home</asp:HyperLink>
 </li> 
 <asp:Repeater runat="server" ID="menu" DataSourceID="SiteMapDataSource1"> 
 <ItemTemplate>
 <li> 
 <asp:HyperLink ID="lnkMenuItem" runat="server" 
 NavigateUrl='<%# Eval("Url") %>'><%# Eval("Title") %></asp:HyperLink>
 <asp:Repeater ID="submenu" runat="server" DataSource="<%# 
 CType(Container.DataItem, SiteMapNode).ChildNodes %>"> 
 <HeaderTemplate> 
 <ul> 
 </HeaderTemplate> 
 <ItemTemplate>
 <li> 
 <asp:HyperLink ID="lnkMenuItem" 
 runat="server" NavigateUrl='<%#  Eval("Url") %>'><%# Eval("Title") %></asp:HyperLink> 
 </li>
 </ItemTemplate> 
 <FooterTemplate> 
 </ul> 
 </FooterTemplate>
 </asp:Repeater> 
 </li> 
 </ItemTemplate> 
 </asp:Repeater> 
</ul>
<asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" ShowStartingNode="false"/>

Приведенная выше разметка привязывает элемент управления Repeater с именем menu к SiteMapDataSource, который возвращает иерархию карты сайта, определенную в Web.sitemap. Так как свойство элемента управления ShowStartingNode SiteMapDataSource имеет значение False, начинается возврат иерархии карты сайта, начиная с потомков узла Home. Repeater отображает каждый из этих узлов (в настоящее время только Членство) в элементе <li> . Затем внутренний повторитель отображает дочерние элементы текущего узла во вложенном неупорядоченном списке.

На рисунке 4 показаны выходные данные приведенной выше разметки со структурой карты сайта, созданной на шаге 2. Repeater отрисовывает ванильный неупорядоченный список разметки; Правила каскадной таблицы стилей, определенные в , Styles.css отвечают за эстетически приятный макет. Более подробное описание работы приведенной выше разметки см. в руководстве по эталонным страницам и навигации по сайтам .

Пользовательский интерфейс навигации отрисовывается с помощью вложенных неупорядоченных списков

Рис. 4. Навигационный пользовательский интерфейс отображается с помощью вложенных неупорядоченных списков (щелкните для просмотра полноразмерного изображения)

Добавление навигации breadcrumb

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

В частности, добавьте <span> элемент в элемент заголовка <div> страницы master и задайте для атрибута class нового <span> элемента значение breadcrumb. (Класс Styles.css содержит правило для класса breadcrumb.) Затем добавьте SiteMapPath в этот новый <span> элемент.

<div id="header"> 
 <span class="title">User Account Tutorials</span><br /> 
 <span class="breadcrumb"> 
 <asp:SiteMapPath ID="SiteMapPath1" runat="server"> 
 </asp:SiteMapPath> 
 </span> 
</div>

На рисунке 5 показаны выходные данные SiteMapPath при посещении ~/Membership/CreatingUserAccounts.aspx.

Навигация отображает текущую страницу и ее предков на карте сайта

Рис. 5. Навигация отображает текущую страницу и ее предков на карте сайта (щелкните для просмотра полноразмерного изображения)

Шаг 4. Удаление пользовательского субъекта и логики удостоверений

Пользовательские объекты субъектов и удостоверений могут быть связаны с пользователем, прошедшим проверку подлинности. Для этого мы создали обработчик событий в Global.asax для события приложения PostAuthenticateRequest , который срабатывает после FormsAuthenticationModule проверки подлинности пользователя. В этом обработчике событий мы заменили GenericPrincipal объекты и FormsIdentity , добавленные с помощью FormsAuthenticationModule , объектами CustomPrincipal и CustomIdentity , созданными в этом руководстве.

Хотя пользовательские объекты субъектов и удостоверений полезны в определенных сценариях, в большинстве случаев GenericPrincipal объектов и FormsIdentity достаточно. Следовательно, я думаю, было бы целесообразно вернуться к поведению по умолчанию. Внесите это изменение, удалив или закомментируя PostAuthenticateRequest обработчик событий или полностью удалив Global.asax файл.

Примечание

После того как вы закомментировали или удалили код в Global.asax, необходимо закомментировать код в Default.aspx's классе кода программной части, который приводит User.Identity свойство к экземпляру CustomIdentity .

Шаг 5. Программное создание нового пользователя

Чтобы создать учетную запись пользователя с помощью платформы членства, используйте Membership метод класса CreateUser. Этот метод содержит входные параметры для имени пользователя, пароля и других полей, связанных с пользователем. При вызове он делегирует создание новой учетной записи пользователя настроенной поставщику членства, а затем возвращает объект, MembershipUser представляющий только что созданную учетную запись пользователя.

Метод CreateUser имеет четыре перегрузки, каждая из которых принимает разное количество входных параметров:

Эти четыре перегрузки отличаются объемом собираемой информации. Например, для первой перегрузки требуется только имя пользователя и пароль для новой учетной записи пользователя, а для второй — адрес электронной почты пользователя.

Эти перегрузки существуют, так как сведения, необходимые для создания новой учетной записи пользователя, зависят от параметров конфигурации поставщика членства. В руководстве Создание схемы членства в SQL Server мы рассмотрели указание параметров конфигурации поставщика членства в Web.config. В таблице 2 приведен полный список параметров конфигурации.

Одним из таких параметров конфигурации поставщика членства, который влияет на то, какие CreateUser перегрузки могут использоваться, является requiresQuestionAndAnswer параметр . Если requiresQuestionAndAnswer для задано значение true (по умолчанию), при создании учетной записи пользователя необходимо указать контрольный вопрос и ответ. Эти сведения используются позже, если пользователю потребуется сбросить или изменить пароль. В частности, в это время им отображается контрольный вопрос, и они должны ввести правильный ответ, чтобы сбросить или изменить пароль. Следовательно, если requiresQuestionAndAnswer для задано значение true , вызов любой из первых двух CreateUser перегрузок приводит к исключению, так как контрольный вопрос и ответ отсутствуют. Так как наше приложение в настоящее время настроено так, чтобы требовать контрольный вопрос и ответ, нам потребуется использовать одну из последних двух перегрузок при программном создании пользователя.

Чтобы проиллюстрировать использование CreateUser метода , создадим пользовательский интерфейс, в котором пользователю предлагается ввести имя, пароль, адрес электронной почты и ответ на предварительно определенный контрольный вопрос. Откройте страницу CreatingUserAccounts.aspx в папке Membership и добавьте следующие веб-элементы управления в элемент управления Содержимое:

  • Элемент TextBox с именем Username
  • Объект TextBox с именем Password, свойство которого TextMode имеет значение Password
  • Элемент TextBox с именем Email
  • Метка с именем SecurityQuestion с Text очищенными свойствами
  • Элемент TextBox с именем SecurityAnswer
  • Кнопка с именем , CreateAccountButton для свойства которой Text задано значение Create the User Account (Создание учетной записи пользователя).
  • Элемент управления Label с именем CreateAccountResults и его Text свойством, очищенным

На этом этапе ваш экран должен выглядеть примерно так, как на снимке экрана, показанном на рисунке 6.

Добавление различных веб-элементов управления на страницу CreatingUserAccounts.aspx

Рис. 6. Добавление различных веб-элементов управления в CreatingUserAccounts.aspx Page (щелкните для просмотра полноразмерного изображения)

Label SecurityQuestion и SecurityAnswer TextBox предназначены для отображения предварительно определенного контрольного вопроса и сбора ответа пользователя. Обратите внимание, что и контрольный вопрос, и ответ хранятся по отдельности, поэтому можно разрешить каждому пользователю определить свой собственный контрольный вопрос. Однако для этого примера я решил использовать универсальный контрольный вопрос, а именно: Какой ваш любимый цвет?

Чтобы реализовать этот предварительно определенный контрольный вопрос, добавьте константу в класс кода программной части страницы с именем passwordQuestion, назначив ей контрольный вопрос. Затем в обработчике Page_Load событий назначьте эту константу свойству SecurityQuestion Label Text :

Const passwordQuestion As String = "What is your favorite color"
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
 If Not Page.IsPostBack Then 
 SecurityQuestion.Text = passwordQuestion 
 End If 
End Sub

Затем создайте обработчик событий для CreateAccountButton' события s Click и добавьте следующий код:

Protected Sub CreateAccountButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles CreateAccountButton.Click 
 Dim createStatus As MembershipCreateStatus 
 Dim newUser As MembershipUser = _ 
 Membership.CreateUser(Username.Text, Password.Text, _ 
 Email.Text, passwordQuestion, _ 
 SecurityAnswer.Text, True, _ 
 createStatus)
 Select Case createStatus 
 Case MembershipCreateStatus.Success 
 CreateAccountResults.Text = "The user account was successfully created!" 
 Case MembershipCreateStatus.DuplicateUserName 
 CreateAccountResults.Text = "There already exists a user with this username." 
 Case MembershipCreateStatus.DuplicateEmail 
 CreateAccountResults.Text = "There already exists a user with this email address." 
 Case MembershipCreateStatus.InvalidEmail
 CreateAccountResults.Text = "There email address you provided in invalid." 
 Case MembershipCreateStatus.InvalidAnswer 
 CreateAccountResults.Text = "There security answer was invalid." 
 Case MembershipCreateStatus.InvalidPassword 
 CreateAccountResults.Text = "The password you provided is invalid. It must be seven characters long and have at least one non-alphanumeric character." 
 Case Else 
 CreateAccountResults.Text = "There was an unknown error; the user account was NOT created."
 End Select 
End Sub

Обработчик Click событий начинается с определения переменной типа createStatusMembershipCreateStatus. MembershipCreateStatus — это перечисление, указывающее состояние CreateUser операции. Например, если учетная запись пользователя создана успешно, результирующий MembershipCreateStatus экземпляр будет иметь значение Success; , с другой стороны, если операция завершится сбоем из-за того, что пользователь с таким же именем пользователя уже существует, ему будет присвоено значение DuplicateUserName. В используемой CreateUser перегрузке необходимо передать MembershipCreateStatus экземпляр в метод . Для этого параметра задается соответствующее значение в методе CreateUser , и мы можем проверить его значение после вызова метода, чтобы определить, была ли учетная запись пользователя успешно создана.

После вызова CreateUser, передавая createStatus, Select Case оператор используется для вывода соответствующего сообщения в зависимости от значения, присвоенного createStatus. На рисунке 7 показаны выходные данные при успешном создании нового пользователя. На рисунках 8 и 9 показаны выходные данные, когда учетная запись пользователя не создана. На рис. 8 посетитель ввел пятибуквенный пароль, который не соответствует требованиям к надежности паролей, указанным в параметрах конфигурации поставщика членства. На рис. 9 посетитель пытается создать учетную запись пользователя с существующим именем пользователя (созданным на рис. 7).

Новая учетная запись пользователя успешно создана

Рис. 7. Новая учетная запись пользователя успешно создана (щелкните для просмотра полноразмерного изображения)

Учетная запись пользователя не создана, так как предоставленный пароль слишком ненадежный

Рис. 8. Учетная запись пользователя не создана, так как предоставленный пароль слишком ненадежный (щелкните для просмотра полноразмерного изображения)

Учетная запись пользователя не создана, так как имя пользователя уже используется

Рис. 9. Учетная запись пользователя не создана, так как имя пользователя уже используется (щелкните для просмотра полноразмерного изображения)

Примечание

Может возникнуть вопрос о том, как определить успешность или сбой при использовании одной из первых двух CreateUser перегрузок метода, ни одна из которых не имеет параметра типа MembershipCreateStatus. Эти первые две перегрузки создают MembershipCreateUserException исключение перед сбоем, который включает StatusCode свойство типа MembershipCreateStatus.

После создания нескольких учетных записей пользователей убедитесь, что учетные записи созданы, перечислив содержимое aspnet_Users таблиц и aspnet_Membership в SecurityTutorials.mdf базе данных. Как показано на рисунке 10, я добавил двух пользователей через страницу CreatingUserAccounts.aspx : Тито и Брюса.

В хранилище пользователей членства есть два пользователя: Тито и Брюс

Рис. 10. В хранилище пользователей членства есть два пользователя: Тито и Брюс (щелкните для просмотра полноразмерного изображения)

Хотя хранилище пользователей членства теперь содержит сведения об учетной записи Брюса и Тито, нам еще предстоит реализовать функции, позволяющие Брюсу или Тито войти на сайт. В настоящее Login.aspx время проверяет учетные данные пользователя на соответствие жестко закодированному набору пар имени пользователя и пароля. Он не проверяет предоставленные учетные данные в рамках платформы членства. Пока что новых учетных записей пользователей aspnet_Users в таблицах и aspnet_Membership должно быть достаточно. В следующем руководстве Проверка учетных данных пользователя в хранилище пользователей членства мы обновим страницу входа для проверки на соответствие хранилищу членства.

Примечание

Если вы не видите пользователей в базе SecurityTutorials.mdf данных, возможно, веб-приложение использует поставщик членства по умолчанию , AspNetSqlMembershipProviderкоторый использует ASPNETDB.mdf базу данных в качестве хранилища пользователей. Чтобы определить, является ли это проблемой, нажмите кнопку Обновить в Обозреватель решения. Если база данных с именем ASPNETDB.mdf была добавлена в папку App_Data , проблема заключается в этом. Вернитесь к шагу 4 руководства Создание схемы членства в SQL Server, чтобы получить инструкции по правильной настройке поставщика членства.

В большинстве сценариев создания учетной записи пользователя посетителю предоставляется интерфейс для ввода имени пользователя, пароля, электронной почты и других важных сведений, после чего создается новая учетная запись. На этом шаге мы рассмотрели создание такого интерфейса вручную, а затем увидели, как использовать Membership.CreateUser метод для программного добавления новой учетной записи пользователя на основе входных данных пользователя. Однако наш код только что создал новую учетную запись пользователя. Он не выполнял никаких дальнейших действий, таких как вход пользователя на сайт под только что созданной учетной записью пользователя или отправка пользователю сообщения с подтверждением. Для выполнения этих дополнительных действий потребуется дополнительный код в обработчике Click событий Button.

ASP.NET поставляется с элементом управления CreateUserWizard, который предназначен для обработки процесса создания учетной записи пользователя, от визуализации пользовательского интерфейса для создания новых учетных записей пользователей до создания учетной записи в платформе членства и выполнения задач после создания учетной записи, таких как отправка подтверждающее сообщение электронной почты и запись только что созданного пользователя на сайт. Использовать элемент управления CreateUserWizard так же просто, как перетащить элемент управления CreateUserWizard с панели элементов на страницу, а затем задать несколько свойств. В большинстве случаев вам не нужно писать ни одной строки кода. Мы подробно рассмотрим этот элемент управления на шаге 6.

Если новые учетные записи пользователей создаются только с помощью типичной веб-страницы Создания учетной записи, маловероятно, что вам когда-либо потребуется написать код, использующий CreateUser метод , так как элемент управления CreateUserWizard, скорее всего, соответствует вашим потребностям. Однако этот CreateUser метод удобно использовать в сценариях, где требуется пользовательский интерфейс создания учетной записи с высокой степенью настройки или когда необходимо программно создавать новые учетные записи пользователей с помощью альтернативного интерфейса. Например, у вас может быть страница, позволяющая пользователю отправить XML-файл, содержащий сведения о пользователе из другого приложения. Страница может проанализировать содержимое отправленного XML-файла и создать новую учетную запись для каждого пользователя, представленного в XML, путем вызова CreateUser метода .

Шаг 6. Создание пользователя с помощью элемента управления CreateUserWizard

ASP.NET поставляется с несколькими веб-элементами управления входа. Эти элементы управления помогают во многих распространенных сценариях, связанных с учетными записями пользователей и входом в систему. Элемент управления CreateUserWizard — это один из таких элементов управления, предназначенный для представления пользовательского интерфейса для добавления новой учетной записи пользователя в платформу членства.

Как и многие другие веб-элементы управления, связанные с именем входа, createUserWizard можно использовать без написания ни одной строки кода. Он интуитивно предоставляет пользовательский интерфейс на основе параметров конфигурации поставщика членства и внутренний вызов Membership метода класса CreateUser после ввода пользователем необходимых сведений и нажатия кнопки Создать пользователя. Элемент управления CreateUserWizard чрезвычайно настраиваемый. Существует множество событий, которые возникают на различных этапах процесса создания учетной записи. При необходимости можно создать обработчики событий для внедрения пользовательской логики в рабочий процесс создания учетной записи. Кроме того, внешний вид CreateUserWizard очень гибкий. Существует ряд свойств, определяющих внешний вид интерфейса по умолчанию; При необходимости элемент управления можно преобразовать в шаблон или добавить дополнительные шаги регистрации пользователя.

Начнем с использования интерфейса и поведения элемента управления CreateUserWizard по умолчанию. Затем мы рассмотрим, как настроить внешний вид с помощью свойств и событий элемента управления.

Изучение интерфейса и поведения createUserWizard по умолчанию

Вернитесь на страницу CreatingUserAccounts.aspx в папке Membership , переключитесь в режим конструктора или разбиения, а затем добавьте элемент управления CreateUserWizard в верхнюю часть страницы. Элемент управления CreateUserWizard подается в разделе Элементы управления для входа на панели элементов. После добавления элемента управления задайте для его ID свойства значение RegisterUser. Как показано на снимке экрана на рисунке 11, createUserWizard отображает интерфейс с текстовыми полями для имени пользователя, пароля, адреса электронной почты, а также контрольного вопроса и ответа нового пользователя.

Элемент управления CreateUserWizard отображает универсальный пользовательский интерфейс создания

Рис. 11. Элемент управления CreateUserWizard отображает универсальный пользовательский интерфейс создания (щелкните для просмотра полноразмерного изображения)

Давайте немного сравним пользовательский интерфейс по умолчанию, созданный элементом управления CreateUserWizard, с интерфейсом, созданным на шаге 5. Для начала элемент управления CreateUserWizard позволяет посетителю указать как контрольный вопрос, так и ответ, тогда как в созданном вручную интерфейсе используется предварительно определенный контрольный вопрос. Интерфейс элемента управления CreateUserWizard также включает элементы управления проверки, тогда как мы еще не реализовали проверку в полях формы нашего интерфейса. Интерфейс элемента управления CreateUserWizard содержит текстовое поле Confirm Password (Confirm Password) (Подтверждение пароля) (вместе с CompareValidator, чтобы убедиться, что текст, введенный в текстовые поля Password (Пароль) и Compare Password (Сравнение пароля) равен).

Интересно то, что элемент управления CreateUserWizard обращается к параметрам конфигурации поставщика членства при отрисовке своего пользовательского интерфейса. Например, текстовые поля контрольных вопросов и ответов отображаются только в том случае, если requiresQuestionAndAnswer для задано значение True. Аналогичным образом CreateUserWizard автоматически добавляет элемент управления RegularExpressionValidator, чтобы обеспечить соблюдение требований к надежности пароля, и задает его ErrorMessage свойства и ValidationExpression на minRequiredPasswordLengthоснове параметров конфигурации , minRequiredNonalphanumericCharactersи passwordStrengthRegularExpression .

Элемент управления CreateUserWizard, как следует из его названия, является производным от элемента управления Wizard. Элементы управления мастера предназначены для предоставления интерфейса для выполнения многоэтапных задач. Элемент управления Мастера может иметь произвольное число WizardSteps, каждый из которых является шаблоном, определяющим элементы управления HTML и web для этого шага. Элемент управления Мастер изначально отображает первый WizardStepэлемент управления , а также элементы управления навигацией, которые позволяют пользователю переходить от одного шага к другому или вернуться к предыдущим шагам.

Как показано в декларативной разметке на рис. 11, интерфейс элемента управления CreateUserWizard по умолчанию включает два WizardStep элемента:

  • CreateUserWizardStep ? отображает интерфейс для сбора сведений о создании новой учетной записи пользователя. Это шаг, показанный на рис. 11.
  • CompleteWizardStep ? отображает сообщение о том, что учетная запись успешно создана.

Внешний вид и поведение CreateUserWizard можно изменить путем преобразования любого из этих шагов в шаблоны или путем добавления собственных WizardStep элементов . Мы рассмотрим WizardStep добавление в интерфейс регистрации в учебнике Хранение дополнительных сведений о пользователе .

Давайте рассмотрим элемент управления CreateUserWizard в действии. Посетите страницу CreatingUserAccounts.aspx через браузер. Начните с ввода недопустимых значений в интерфейс CreateUserWizard. Попробуйте ввести пароль, который не соответствует требованиям к надежности пароля, или оставить текстовое поле Имя пользователя пустым. CreateUserWizard отобразит соответствующее сообщение об ошибке. На рисунке 12 показаны выходные данные при попытке создать пользователя с недостаточно надежным паролем.

CreateUserWizard Автоматически внедряет элементы управления проверкой

Рис. 12. CreateUserWizard Автоматически внедряет элементы управления проверкой (щелкните для просмотра полноразмерного изображения)

Затем введите соответствующие значения в createUserWizard и нажмите кнопку Создать пользователя. При условии, что обязательные поля были введены и надежность пароля достаточна, CreateUserWizard создаст новую учетную запись пользователя с помощью платформы членства, а затем отобразит CompleteWizardStepинтерфейс (см. рис. 13). В фоновом режиме CreateUserWizard вызывает Membership.CreateUser метод , как и на шаге 5.

Новая учетная запись пользователя успешно создана

Рис. 13. Новая учетная запись пользователя успешно создана (щелкните для просмотра полноразмерного изображения)

Примечание

Как показано на рисунке CompleteWizardStep13, интерфейс содержит кнопку Продолжить. Однако в этот момент нажатие на него просто выполняет обратную передачу, оставляя посетителя на той же странице. В разделе Настройка внешнего вида и поведения CreateUserWizard через его свойства мы рассмотрим, как вы можете отправить эту кнопку посетителю (или на другую страницу Default.aspx ).

После создания учетной записи пользователя вернитесь в Visual Studio и просмотрите aspnet_Users таблицы и aspnet_Membership , как это было показано на рис. 10, чтобы убедиться, что учетная запись успешно создана.

Настройка поведения и внешнего вида CreateUserWizard с помощью его свойств

CreateUserWizard можно настроить различными способами с помощью свойств, WizardStep объектов и обработчиков событий. В этом разделе мы рассмотрим, как настроить внешний вид элемента управления с помощью его свойств. В следующем разделе рассматривается расширение поведения элемента управления с помощью обработчиков событий.

Практически весь текст, отображаемый в пользовательском интерфейсе элемента управления CreateUserWizard по умолчанию, можно настроить с помощью множества свойств. Например, метки Имя пользователя, Пароль, Подтверждение пароля, Электронная почта, Контрольный вопрос и Ответ безопасности, отображаемые слева от текстовых полей, можно настроить с помощью UserNameLabelTextсвойств , PasswordLabelText, ConfirmPasswordLabelText, EmailLabelText, QuestionLabelTextи AnswerLabelText соответственно. Аналогичным образом существуют свойства для указания текста для кнопок Создать пользователя и Продолжить в CreateUserWizardStep и CompleteWizardStep, а также, если эти кнопки отображаются как Button, LinkButtons или ImageButtons.

Цвета, границы, шрифты и другие визуальные элементы можно настроить с помощью ряда свойств стиля. Сам элемент управления CreateUserWizard имеет общие свойства стиля веб-элемента управления — BackColor, BorderStyle, CssClass, Fontи т. д., а также существует ряд свойств стиля для определения внешнего вида определенных разделов интерфейса CreateUserWizard. Свойство TextBoxStyle , например, определяет стили для текстовых поля в CreateUserWizardStep, а TitleTextStyle свойство определяет стиль для заголовка ( Sign Up for Your New Account ).

Помимо свойств, связанных с внешним видом, существует ряд свойств, влияющих на поведение элемента управления CreateUserWizard. СвойствоDisplayCancelButton, если задано значение True, отображает кнопку Отмена рядом с кнопкой Создать пользователя (значение по умолчанию — False). Если отображается кнопка Отмена, обязательно задайте CancelDestinationPageUrl свойство , указывающее страницу, на которую пользователь будет отправлен после нажатия кнопки Отмена. Как отмечалось в предыдущем разделе, кнопка Продолжить в CompleteWizardStepинтерфейсе вызывает обратную передачу, но оставляет посетителя на той же странице. Чтобы отправить посетителя на другую страницу после нажатия кнопки Продолжить, просто укажите URL-адрес в свойствеContinueDestinationPageUrl .

Давайте обновим RegisterUser элемент управления CreateUserWizard, чтобы отобразить кнопку Отмена и отправить посетителю Default.aspx команду при нажатии кнопок Отмена или Продолжить. Для этого задайте для DisplayCancelButton свойства значение True, а свойства CancelDestinationPageUrl и ContinueDestinationPageUrl — ~/Default.aspx. На рисунке 14 показан обновленный файл CreateUserWizard при просмотре через браузер.

CreateUserWizardStep включает кнопку

Рис. 14. Кнопка CreateUserWizardStep "Включает отмену" (нажмите для просмотра полноразмерного изображения)

Когда посетитель вводит имя пользователя, пароль, адрес электронной почты, контрольный вопрос и ответ и нажимает кнопку Создать пользователя, создается новая учетная запись пользователя, и посетитель входит в систему как только что созданный пользователь. Предположим, что пользователь, посещающий страницу, создает новую учетную запись для себя, это, скорее всего, желаемое поведение. Однако может потребоваться разрешить администраторам добавлять новые учетные записи пользователей. При этом будет создана учетная запись пользователя, но администратор останется в системе с правами администратора (а не как только что созданная учетная запись). Это поведение можно изменить с помощью свойства BooleanLoginCreatedUser.

Учетные записи пользователей в платформе членства содержат утвержденный флаг; Пользователи, которые не утверждены, не могут войти на сайт. По умолчанию созданная учетная запись помечается как утвержденная, что позволяет пользователю немедленно войти на сайт. Однако можно иметь новые учетные записи пользователей, помеченные как неутвержденные. Возможно, вы хотите, чтобы администратор вручную утвердил новых пользователей, прежде чем они смогут войти в систему; Или, может быть, вы хотите убедиться, что адрес электронной почты, введенный при регистрации, действителен, прежде чем разрешить пользователю войти в систему. В любом случае вы можете пометить только что созданную учетную запись пользователя как неутвержденную, установив для свойства элемента управления DisableCreatedUser CreateUserWizard значение True (по умолчанию — False).

Другие свойства, связанные с поведением примечания, включают AutoGeneratePassword и MailDefinition. AutoGeneratePassword Если свойство имеет значение True, CreateUserWizardStep не отображает текстовые поля Пароль и Подтверждение пароля. Вместо этого созданный пароль пользователя автоматически создается с помощью Membershipметода классаGeneratePassword . Метод GeneratePassword создает пароль указанной длины и содержит достаточное количество символов, не являющихся буквенно-цифровыми, для удовлетворения настроенных требований к надежности пароля.

СвойствоMailDefinition полезно, если вы хотите отправить сообщение электронной почты на адрес электронной почты, указанный в процессе создания учетной записи. Свойство MailDefinition содержит ряд вложенных свойств для определения сведений о созданном сообщении электронной почты. Эти вложенные свойства включают такие параметры, как Subject, Priority, IsBodyHtml, CCFrom, и BodyFileName. СвойствоBodyFileName указывает на текстовый или HTML-файл, содержащий текст сообщения электронной почты. Текст поддерживает два предварительно определенных заполнителя: <%UserName%> и <%Password%>. Эти заполнители, если они присутствуют в BodyFileName файле, будут заменены только что созданными именем и паролем пользователя.

Примечание

Свойство CreateUserWizard элемента управления MailDefinition просто указывает сведения о сообщении электронной почты, которое отправляется при создании новой учетной записи. Он не содержит никаких сведений о том, как на самом деле отправляется сообщение электронной почты (то есть, используется ли SMTP-сервер или каталог удаления почты, какие-либо сведения о проверке подлинности и т. д.). Эти низкоуровневые сведения необходимо определить в <system.net> разделе в Web.config. Дополнительные сведения об этих параметрах конфигурации и отправке сообщений электронной почты из ASP.NET 2.0 в целом см. в разделе часто задаваемых вопросов по адресу SystemNetMail.com и моей статье Отправка Email в ASP.NET 2.0.

Расширение поведения CreateUserWizard с помощью обработчиков событий

Элемент управления CreateUserWizard вызывает ряд событий во время рабочего процесса. Например, когда посетитель введет имя пользователя, пароль и другие важные сведения и нажмет кнопку Создать пользователя, элемент управления CreateUserWizard вызывает событиеCreatingUser. Если во время создания возникла проблема, CreateUserError событие запускается; однако, если пользователь успешно создан, CreatedUser возникает событие . Существуют дополнительные события элемента управления CreateUserWizard, которые вызываются, но это три наиболее немецких события.

В некоторых сценариях может потребоваться использовать рабочий процесс CreateUserWizard, который можно сделать, создав обработчик событий для соответствующего события. Чтобы проиллюстрировать это, давайте дополним RegisterUser элемент управления CreateUserWizard, чтобы включить пользовательскую проверку имени пользователя и пароля. В частности, давайте расширим возможности CreateUserWizard, чтобы имена пользователей не содержали начальные или конечные пробелы, а имя пользователя не отображалось в любом месте пароля. Короче говоря, мы хотим запретить пользователю создавать имя пользователя, например "Scott", или использовать сочетание имени пользователя и пароля, например Scott и Scott.1234.

Для этого мы создадим обработчик событий для выполнения дополнительных CreatingUser проверок. Если предоставленные данные недопустимы, необходимо отменить процесс создания. Также необходимо добавить веб-элемент управления Метка на страницу, чтобы отобразить сообщение о недопустимости имени пользователя или пароля. Начните с добавления элемента управления Label под элементом управления CreateUserWizard, задав для его ID свойства значение InvalidUserNameOrPasswordMessage , а для свойства ForeColor — значение Red. Очистите его Text свойство и задайте для его EnableViewState свойств и Visible значение False.

<asp:Label runat="server"" id="InvalidUserNameOrPasswordMessage"
 Visible="false" ForeColor="Red" EnableViewState="false"> 
</asp:Label>

Затем создайте обработчик событий для события элемента управления CreatingUser CreateUserWizard. Чтобы создать обработчик событий, выберите элемент управления в Designer и перейдите в окно Свойства. Щелкните значок молнии и дважды щелкните соответствующее событие, чтобы создать обработчик событий.

Добавьте следующий код в обработчик событий CreatingUser .

Protected Sub RegisterUser_CreatingUser(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.LoginCancelEventArgs) Handles RegisterUser.CreatingUser
 Dim trimmedUserName As String = RegisterUser.UserName.Trim() 
 If RegisterUser.UserName.Length <> trimmedUserName.Length Then 
 ' Show the error message 
 InvalidUserNameOrPasswordMessage.Text = "The username cannot contain leading or trailing spaces." 
 InvalidUserNameOrPasswordMessage.Visible = True 
 ' Cancel the create user workflow 
 e.Cancel = True 
 Else 
 ' Username is valid, make sure that the password does not contain the username 
 If RegisterUser.Password.IndexOf(RegisterUser.UserName, StringComparison.OrdinalIgnoreCase) >= 0 Then 
 ' Show the error message 
 InvalidUserNameOrPasswordMessage.Text = "The username may not appear anywhere in the password." 
 InvalidUserNameOrPasswordMessage.Visible = True 
 ' Cancel the create user workflow 
 e.Cancel = True 
 End If 
 End If 
End Sub

Обратите внимание, что имя пользователя и пароль, введенные в элементе управления CreateUserWizard, доступны через его UserName свойства и Passwordсоответственно. Мы используем эти свойства в приведенном выше обработчике событий, чтобы определить, содержит ли указанное имя пользователя начальные или конечные пробелы и находится ли имя пользователя в пароле. Если выполняется любое из этих условий, в InvalidUserNameOrPasswordMessage метке отображается сообщение об ошибке, а свойству обработчика e.Cancel событий присваивается значение True. Если e.Cancel для задано значение True, CreateUserWizard укораживает свой рабочий процесс, фактически отменяя процесс создания учетной записи пользователя.

На рисунке 15 показан снимок экрана, показывающий CreatingUserAccounts.aspx , когда пользователь вводит имя пользователя с пробелами в начале.

Имена пользователей с начальными или конечными пробелами не разрешены

Рис. 15. Имена пользователей с начальными или конечными пробелами запрещены (щелкните для просмотра полноразмерного изображения)

Примечание

Пример использования события элемента управления CreatedUser CreateUserWizard мы рассмотрим в учебнике Хранение дополнительных сведений о пользователе .

Сводка

Метод Membership класса CreateUser создает новую учетную запись пользователя на платформе членства. Это делается путем делегирования вызова настроенного поставщика членства. В случае SqlMembershipProviderс методом CreateUser добавляется запись в aspnet_Users таблицы базы данных и aspnet_Membership .

Хотя новые учетные записи пользователей можно создавать программным способом (как мы видели на шаге 5), быстрее и проще использовать элемент управления CreateUserWizard. Этот элемент управления отображает многошаговый пользовательский интерфейс для сбора сведений о пользователе и создания нового пользователя на платформе членства. В этом элементе управления используется тот же Membership.CreateUser метод, что и на шаге 5, но элемент управления создает пользовательский интерфейс, элементы управления проверки и реагирует на ошибки создания учетных записей пользователей без необходимости написания кода.

На этом этапе у нас есть функциональные возможности для создания новых учетных записей пользователей. Однако страница входа по-прежнему выполняет проверку на соответствие тем жестко заданным учетным данным, которые мы указали во втором руководстве. В следующем руководстве мы обновимLogin.aspx, чтобы проверить предоставленные пользователем учетные данные на платформе членства.

Счастливого программирования!

Дополнительные материалы

Дополнительные сведения о темах, рассмотренных в этом руководстве, см. в следующих ресурсах:

Об авторе

Скотт Митчелл(Scott Mitchell), автор нескольких книг ASP/ASP.NET и основатель 4GuysFromRolla.com, работает с веб-технологиями Майкрософт с 1998 года. Скотт работает независимым консультантом, тренером и писателем. Его последняя книга Sams Teach Yourself ASP.NET 2.0 в 24 часах. Скотт может быть доступен в mitchell@4guysfromrolla.com или через его блог по адресу http://ScottOnWriting.NET.

Особая благодарность

Эта серия учебников была рассмотрена многими полезными рецензентами. Ведущим рецензентом этого руководства была Тетера Мерфи. Хотите просмотреть предстоящие статьи MSDN? Если да, опустите мне строку на mitchell@4GuysFromRolla.com.