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

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

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

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

Введение

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

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

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

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

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

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

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

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

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

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

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

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

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

Однако для этих пяти страниц нам нужно отобразить разметку ContentPlaceHolder для главной страницы по умолчанию LoginContent . Поэтому удалите декларативную разметку для 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 включает ряд связанных с навигацией веб-элементов управления для разработки пользовательского интерфейса. К ним относятся меню, TreeView и элементы управления SiteMapPath. Элементы управления "меню" и "TreeView" отображают структуру узла в меню или дереве соответственно, в то время как в SiteMapPath отображается навигатор, показывающий текущий посещаемый узел и его предки. Данные карт узла можно привязать к другим веб-элементам управления данными с помощью SiteMapDataSource, и доступ к ним можно получить программно с помощью SiteMap класса.

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

Чтобы создать этот интерфейс, добавьте следующую декларативную разметку в Site.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="<%#
                         ((SiteMapNode) Container.DataItem).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> элементе. Другой, внутренний Repeater, затем отображает дочерние элементы текущего узла во вложенном неупорядоченном списке.

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

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

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

Добавление навигации по навигатору

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

В частности, добавьте <span> элемент к элементу заголовка главной страницы <div> и задайте <span> для атрибута нового элемента значение class "Навигатор". ( Styles.css Класс содержит правило для "иерархического" класса.) Затем добавьте в этот новый элемент элемент 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. Удаление настраиваемой логики субъекта и удостоверения

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

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

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

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

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

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

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

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

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

  • Текстовое поле с именем Username
  • Текстовое поле с именем Password , TextMode свойство которого имеет значение Password
  • Текстовое поле с именем Email
  • Метка с именем SecurityQuestion и ее Text свойством "убрана"
  • Текстовое поле с именем SecurityAnswer
  • Кнопка с именем CreateAccountButton , для которой свойство Text имеет значение "создать учетную запись пользователя"
  • Элемент управления Label CreateAccountResults с именем и его Text свойством очистить

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

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

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

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

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

const string passwordQuestion = "What is your favorite color";
    
protected void Page_Load(object sender, EventArgs e)
{
     if (!Page.IsPostBack)
          SecurityQuestion.Text = passwordQuestion;
}

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

protected void CreateAccountButton_Click(object sender, EventArgs e)
{
     MembershipCreateStatus createStatus;
     MembershipUser newUser = Membership.CreateUser(Username.Text, Password.Text, Email.Text, passwordQuestion, SecurityAnswer.Text, true, out createStatus);
     switch (createStatus)
     {
          case MembershipCreateStatus.Success:
               CreateAccountResults.Text = "The user account was successfully created!";
               break;
          case MembershipCreateStatus.DuplicateUserName:
               CreateAccountResults.Text = "There already exists a user with this username.";
               break;

          case MembershipCreateStatus.DuplicateEmail:
               CreateAccountResults.Text = "There already exists a user with this email address.";
               break;
          case MembershipCreateStatus.InvalidEmail:
               CreateAccountResults.Text = "There email address you provided in invalid.";
               break;
          case MembershipCreateStatus.InvalidAnswer:
               CreateAccountResults.Text = "There security answer was invalid.";
               break;
          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.";

               break;
          default:
               CreateAccountResults.Text = "There was an unknown error; the user account was NOT created.";
               break;
     }
}

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

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

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

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

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

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

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

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

Note

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

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

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

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

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

Note

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

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

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 содержит текстовое поле "подтверждение пароля" (вместе с объектом CompareValidator, чтобы убедиться, что текст, введенный в текстовые поля "пароль" и "сравнить пароль", равен).

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

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

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

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

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

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

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

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

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

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

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

Note

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

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

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

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

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

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

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

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

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

Рис. 14. CreateUserWizardStep включает кнопку "Отмена" (щелкните, чтобы просмотреть изображение с полным размером)

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

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

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

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

Note

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

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

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

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

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

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

</asp:Label>

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

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

protected void RegisterUser_CreatingUser(object sender, LoginCancelEventArgs e)
{
     string trimmedUserName = RegisterUser.UserName.Trim();
     if (RegisterUser.UserName.Length != trimmedUserName.Length)
     {
          // 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)
          {
               // 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;
          }
     }
}

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

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

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

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

Note

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

Сводка

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

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

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

Поздравляем с программированием!

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

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

Об авторе

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

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

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