Создание учетных записей пользователей (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
в сценарии проверки подлинности на основе форм перед реализацией функций членства в веб-приложении необходимо выполнить следующие действия:
- Включите проверку подлинности на основе форм. Как мы говорили в обзоре проверки подлинности с помощью форм, проверка подлинности с помощью форм включается путем изменения
Web.config
и установки<authentication>
атрибутаmode
элемента в значениеForms
. Если включена проверка подлинности с помощью форм, каждый входящий запрос проверяется на наличие запроса на проверку подлинности с помощью форм, который идентифицирует инициатор запроса. - Добавьте схему служб приложений в соответствующую базу данных. При использовании
SqlMembershipProvider
необходимо установить схему служб приложений в базу данных. Обычно эта схема добавляется в ту же базу данных, в которой хранится модель данных приложения. В руководствеСоздание схемы членства в SQL Server рассматривается использованиеaspnet_regsql.exe
средства для этого. - Настройте параметры веб-приложения для ссылки на базу данных из шага 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
.
Рис. 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.
Добавление Two-Level списка ссылок в левом столбце
Чтобы создать этот интерфейс, добавьте следующую декларативную разметку в 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
имеет четыре перегрузки, каждая из которых принимает разное количество входных параметров:
CreateUser(username, password)
CreateUser(username, password, email)
CreateUser(username, password, email, passwordQuestion, passwordAnswer, isApproved, MembershipCreateStatus)
CreateUser(username, password, email, passwordQuestion, passwordAnswer, isApproved, providerUserKey, MembershipCreateStatus)
Эти четыре перегрузки отличаются объемом собираемой информации. Например, для первой перегрузки требуется только имя пользователя и пароль для новой учетной записи пользователя, а для второй — адрес электронной почты пользователя.
Эти перегрузки существуют, так как сведения, необходимые для создания новой учетной записи пользователя, зависят от параметров конфигурации поставщика членства. В руководстве Создание схемы членства в 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.
Рис. 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
событий начинается с определения переменной типа createStatus
MembershipCreateStatus
. 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 отображает интерфейс с текстовыми полями для имени пользователя, пароля, адреса электронной почты, а также контрольного вопроса и ответа нового пользователя.
Рис. 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 показаны выходные данные при попытке создать пользователя с недостаточно надежным паролем.
Рис. 12. CreateUserWizard Автоматически внедряет элементы управления проверкой (щелкните для просмотра полноразмерного изображения)
Затем введите соответствующие значения в createUserWizard и нажмите кнопку Создать пользователя. При условии, что обязательные поля были введены и надежность пароля достаточна, CreateUserWizard создаст новую учетную запись пользователя с помощью платформы членства, а затем отобразит CompleteWizardStep
интерфейс (см. рис. 13). В фоновом режиме CreateUserWizard вызывает Membership.CreateUser
метод , как и на шаге 5.
Рис. 13. Новая учетная запись пользователя успешно создана (щелкните для просмотра полноразмерного изображения)
Примечание
Как показано на рисунке CompleteWizardStep
13, интерфейс содержит кнопку Продолжить. Однако в этот момент нажатие на него просто выполняет обратную передачу, оставляя посетителя на той же странице. В разделе Настройка внешнего вида и поведения 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 при просмотре через браузер.
Рис. 14. Кнопка CreateUserWizardStep
"Включает отмену" (нажмите для просмотра полноразмерного изображения)
Когда посетитель вводит имя пользователя, пароль, адрес электронной почты, контрольный вопрос и ответ и нажимает кнопку Создать пользователя, создается новая учетная запись пользователя, и посетитель входит в систему как только что созданный пользователь. Предположим, что пользователь, посещающий страницу, создает новую учетную запись для себя, это, скорее всего, желаемое поведение. Однако может потребоваться разрешить администраторам добавлять новые учетные записи пользователей. При этом будет создана учетная запись пользователя, но администратор останется в системе с правами администратора (а не как только что созданная учетная запись). Это поведение можно изменить с помощью свойства BooleanLoginCreatedUser
.
Учетные записи пользователей в платформе членства содержат утвержденный флаг; Пользователи, которые не утверждены, не могут войти на сайт. По умолчанию созданная учетная запись помечается как утвержденная, что позволяет пользователю немедленно войти на сайт. Однако можно иметь новые учетные записи пользователей, помеченные как неутвержденные. Возможно, вы хотите, чтобы администратор вручную утвердил новых пользователей, прежде чем они смогут войти в систему; Или, может быть, вы хотите убедиться, что адрес электронной почты, введенный при регистрации, действителен, прежде чем разрешить пользователю войти в систему. В любом случае вы можете пометить только что созданную учетную запись пользователя как неутвержденную, установив для свойства элемента управления DisableCreatedUser
CreateUserWizard значение True (по умолчанию — False).
Другие свойства, связанные с поведением примечания, включают AutoGeneratePassword
и MailDefinition
. AutoGeneratePassword
Если свойство имеет значение True, CreateUserWizardStep
не отображает текстовые поля Пароль и Подтверждение пароля. Вместо этого созданный пароль пользователя автоматически создается с помощью Membership
метода классаGeneratePassword
. Метод GeneratePassword
создает пароль указанной длины и содержит достаточное количество символов, не являющихся буквенно-цифровыми, для удовлетворения настроенных требований к надежности пароля.
СвойствоMailDefinition
полезно, если вы хотите отправить сообщение электронной почты на адрес электронной почты, указанный в процессе создания учетной записи. Свойство MailDefinition
содержит ряд вложенных свойств для определения сведений о созданном сообщении электронной почты. Эти вложенные свойства включают такие параметры, как Subject
, Priority
, IsBodyHtml
, CC
From
, и 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
, чтобы проверить предоставленные пользователем учетные данные на платформе членства.
Счастливого программирования!
Дополнительные материалы
Дополнительные сведения о темах, рассмотренных в этом руководстве, см. в следующих ресурсах:
CreateUser
Техническая документация- Общие сведения о элементе управления CreateUserWizard
- Создание поставщика карт сайта System-Based файлов
- Создание пошагового пользовательского интерфейса с помощью элемента управления мастера ASP.NET 2.0
- Изучение навигации сайта ASP.NET 2.0
- Главные страницы и навигация по сайту
- Поставщик карты сайта SQL, который вы ждали
Об авторе
Скотт Митчелл(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.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по