Поделиться через


Создание схемы членства в SQL Server (VB)

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

Заметка

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

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

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

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

Знакомство

Предыдущие два руководства рассматривали использование проверки подлинности форм для идентификации посетителей веб-сайта. Фреймворк аутентификации посредством форм упрощает для разработчиков авторизацию пользователя на веб-сайте и запоминать их между посещениями страниц с помощью токенов аутентификации. Класс FormsAuthentication содержит методы для создания тикета и добавления его в файлы cookie посетителя. FormsAuthenticationModule проверяет все входящие запросы, а для тех, у кого есть действительный билет проверки подлинности, создаёт и связывает объекты GenericPrincipal и FormsIdentity с текущим запросом. Аутентификация форм — это просто механизм предоставления билета аутентификации посетителю при входе в систему, а при последующих запросах разбор этого билета для определения удостоверения пользователя. Для поддержки учетных записей пользователей веб-приложению необходимо реализовать хранилище пользователей и добавить функциональность для проверки учетных данных, регистрации новых пользователей и других задач, связанных с учетной записью пользователя.

До ASP.NET 2.0 разработчики были ответственны за реализацию всех этих задач, связанных с учетными записями пользователей. К счастью, команда ASP.NET признала этот недостаток и представила платформу членства с ASP.NET 2.0. Платформа членства — это набор классов в .NET Framework, предоставляющий программный интерфейс для выполнения основных задач, связанных с учетной записью пользователя. Эта платформа основана намодели поставщика , что позволяет разработчикам подключать настраиваемую реализацию к стандартизованному API.

Как описано в руководстве по основам безопасности и ASP.NET поддержке, платформа .NET Framework поставляется с двумя встроенными поставщиками членства: ActiveDirectoryMembershipProvider и SqlMembershipProvider. Как предполагается, SqlMembershipProvider использует базу данных Microsoft SQL Server в качестве пользовательского хранилища. Чтобы использовать этот поставщик в приложении, необходимо сообщить поставщику, какую базу данных следует использовать в качестве хранилища. Как вы можете себе представить, SqlMembershipProvider ожидает, что база данных пользовательского хранилища будет иметь определенные таблицы, представления и хранимые процедуры. Необходимо добавить эту ожидаемую схему в выбранную базу данных.

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

Давайте приступим!

Шаг 1. Выбор места для размещения пользовательского хранилища

Данные приложения ASP.NET обычно хранятся в нескольких таблицах в базе данных. При реализации схемы базы данных SqlMembershipProvider необходимо решить, следует ли разместить схему членства в той же базе данных, что и данные приложения или в альтернативной базе данных.

Рекомендуется найти схему членства в той же базе данных, что и данные приложения по следующим причинам:

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

Разделение данных хранилища пользователей и приложений на отдельные базы данных имеет смысл только в том случае, если у вас несколько приложений, которые используют отдельные базы данных, но необходимо предоставить общий доступ к хранилищу пользователей.

Создание базы данных

Приложение, которое мы создали после второго руководства, еще не требует базы данных. Однако нам нужен один из них для пользовательского хранилища. Давайте создадим его, а затем добавим в нее схему, необходимую поставщиком SqlMembershipProvider (см. шаг 2).

Заметка

В этой серии учебников мы будем использовать базу данных Microsoft SQL Server 2005 Express Edition для хранения таблиц приложений и схемы SqlMembershipProvider. Это решение было принято по двум причинам: во-первых, из-за ее стоимости - бесплатно - Express Edition является наиболее доступной версией SQL Server 2005; во-вторых, базы данных SQL Server 2005 Express Edition можно поместить непосредственно в папку App_Data веб-приложения, что позволяет упаковать базу данных и веб-приложение вместе в один ZIP-файл и повторно развернуть ее без особых инструкций по настройке или параметров конфигурации. Если вы предпочитаете использовать версию SQL Server, отличающуюся от Express Edition, пожалуйста, выбирайте её свободно. Шаги практически идентичны. Схема SqlMembershipProvider будет работать с любой версией Microsoft SQL Server 2000 и более поздних версий.

В обозревателе решений щелкните правой кнопкой мыши папку App_Data и выберите команду "Добавить новый элемент". (Если в проекте нет папки App_Data, щелкните проект правой кнопкой мыши в обозревателе решений, выберите "Добавить ASP.NET папку" и выберите App_Data.) В диалоговом окне "Добавление нового элемента" выберите добавить новую базу данных SQL с именем SecurityTutorials.mdf. В этом руководстве мы добавим схему SqlMembershipProvider в эту базу данных; В последующих руководствах мы создадим дополнительные таблицы для записи данных приложения.

добавить новую базу данных SQL с именем SecurityTutorials.mdf в папку App_Data

рис. 1. Добавление новой SQL базы данных с именем SecurityTutorials.mdf в папку App_Data (Щелкните, чтобы просмотреть изображение в полном размере)

Добавление базы данных в папку App_Data автоматически включает ее в представление обозревателя баз данных. (В версии Visual Studio, отличной от Express Edition, обозреватель баз данных называется обозревателем серверов.) Перейдите в обозреватель базы данных и разверните только что добавленную базу данных SecurityTutorials. Если на экране не отображается обозреватель баз данных, перейдите в меню "Вид" и выберите обозреватель базы данных или нажмите клавиши CTRL+ALT+S. Как показано на рисунке 2, база данных SecurityTutorials пуста— она не содержит таблиц, представлений и никаких хранимых процедур.

База данных SecurityTutorials в настоящее время пуста

рис. 2: база данных SecurityTutorials в настоящее время пуста (Щелкните, чтобы просмотреть изображение полного размера)

Шаг 2. Добавление схемыSqlMembershipProviderв базу данных

Для SqlMembershipProvider требуется установка определенного набора таблиц, представлений и хранимых процедур в базе данных пользовательского хранилища. Эти необходимые объекты базы данных можно добавить с помощью средства aspnet_regsql.exe. Этот файл находится в папке %WINDIR%\Microsoft.Net\Framework\v2.0.50727\.

Заметка

Средство aspnet_regsql.exe предоставляет функции командной строки и графический пользовательский интерфейс. Графический интерфейс является более понятным для пользователя и является тем, что мы рассмотрим в этом руководстве. Интерфейс командной строки полезен при автоматическом добавлении схемы SqlMembershipProvider, например в сценариях сборки или сценариях автоматического тестирования.

Средство aspnet_regsql.exe используется для добавления или удаления служб приложений ASP.NET в указанную базу данных SQL Server. Службы приложений ASP.NET включают схемы для SqlMembershipProvider и SqlRoleProvider, а также схемы для поставщиков, использующих SQL, для других фреймворков ASP.NET 2.0. Необходимо предоставить два бита информации средству aspnet_regsql.exe:

  • Нужно ли добавлять или удалять службы приложений и
  • База данных, из которой необходимо добавить или удалить схему служб приложений

При появлении запроса на использование базы данных средство aspnet_regsql.exe просит указать имя сервера, на котором находится база данных, учетные данные безопасности для подключения к базе данных и имя базы данных. Если вы используете не Express Edition SQL Server, вы уже должны знать эти сведения, так как это те же сведения, которые необходимо предоставить через строку подключения при работе с базой данных через веб-страницу ASP.NET. Определение имени сервера и базы данных при использовании базы данных SQL Server 2005 Express Edition в папке App_Data, однако, требует выполнения дополнительных шагов.

В следующем разделе рассматривается простой способ указания имени сервера и базы данных для базы данных SQL Server 2005 Express Edition в папке App_Data. Если вы не используете SQL Server 2005 Express Edition, вы можете перейти к разделу "Установка служб приложений".

Определение имени сервера и базы данных для базы данных SQL Server 2005 Express Edition в папкеApp_Data

Чтобы использовать средство aspnet_regsql.exe, необходимо знать имена серверов и баз данных. Имя сервера — localhost\InstanceName. Скорее всего, ИмяЭкземпляра - SQLExpress. Однако если вы установили SQL Server 2005 Express Edition вручную (то есть не устанавливали его автоматически при установке Visual Studio), возможно, что вы выбрали другое имя экземпляра.

Определение имени базы данных немного сложнее. Базы данных в папке App_Data обычно имеют имя базы данных, включающее глобально уникальный идентификатор вместе с путем к файлу базы данных. Чтобы добавить схему служб приложений через aspnet_regsql.exe, необходимо определить это имя базы данных.

Самый простой способ определить имя базы данных — проверить его с помощью SQL Server Management Studio. SQL Server Management Studio предоставляет графический интерфейс для управления базами данных SQL Server 2005, но не поставляется с Express Edition SQL Server 2005. Хорошая новость заключается в том, что вы можете скачать бесплатную версию Express Edition SQL Server Management Studio.

Заметка

Если у вас также есть версия SQL Server 2005, не связанная с Express Edition, скорее всего, установлена полная версия Management Studio. Вы можете использовать полную версию для определения имени базы данных, выполнив те же действия, что и описано ниже для Express Edition.

Сначала закройте Visual Studio, чтобы убедиться, что все блокировки, введенные Visual Studio в файле базы данных, закрыты. Затем запустите SQL Server Management Studio и подключитесь к базе данных localhost\InstanceName для SQL Server 2005 Express Edition. Вероятно, как отмечалось ранее, имя экземпляра — SQLExpress. Для параметра "Проверка подлинности" выберите "Проверка подлинности Windows".

Подключение к экземпляру SQL Server 2005 Express Edition

рис. 3: Подключение к экземпляру SQL Server 2005 Express Edition (Щелкните, чтобы просмотреть изображение полного размера)

После подключения к экземпляру SQL Server 2005 Express Edition Management Studio отображает папки для баз данных, параметров безопасности, объектов сервера и т. д. Если вы развернете вкладку "Базы данных", вы увидите, что база данных SecurityTutorials.mdfне зарегистрирована в экземпляре базы данных. Сначала необходимо присоединить базу данных.

Щелкните правой кнопкой мыши папку "Базы данных" и выберите "Присоединить" в контекстном меню. Откроется диалоговое окно "Присоединение баз данных". Здесь нажмите кнопку "Добавить", перейдите к базе данных SecurityTutorials.mdf и нажмите кнопку "ОК". На рисунке 4 показано диалоговое окно "Присоединение баз данных" после выбора базы данных SecurityTutorials.mdf. На рисунке 5 показан обозреватель объектов Management Studio после успешного подключения базы данных.

Подключите базу данных SecurityTutorials.mdf

рис. 4: Прикрепите базу данных SecurityTutorials.mdf (Щелкните, чтобы просмотреть полноразмерное изображение)

база данных SecurityTutorials.mdf отображается в папке баз данных

рис. 5: база данных SecurityTutorials.mdf отображается в папке баз данных (Щелкните, чтобы просмотреть изображение полного размера)

Как показано на рисунке 5, база данных SecurityTutorials.mdf имеет довольно простое имя. Давайте изменим его на более запоминающееся (и проще ввести) имя. Щелкните базу данных правой кнопкой мыши, выберите "Переименовать" в контекстном меню и переименуйте ее SecurityTutorialsDatabase. Это не изменяет имя файла, а только имя, которое база данных использует для идентификации в SQL Server.

переименовать базу данных в SecurityTutorialsDatabase

рис. 6. Переименование базы данных в SecurityTutorialsDatabase(Щелкните, чтобы просмотреть полноразмерное изображение)

На этом этапе мы знаем имена серверов и баз данных для файла базы данных SecurityTutorials.mdf: localhost\InstanceName и SecurityTutorialsDatabaseсоответственно. Теперь мы готовы установить службы приложений с помощью средства aspnet_regsql.exe.

Установка служб приложений

Чтобы запустить средство aspnet_regsql.exe, перейдите в меню "Пуск" и нажмите кнопку "Выполнить". Введите %WINDIR%\Microsoft.Net\Framework\v2.0.50727\aspnet_regsql.exe в текстовое поле и нажмите кнопку "ОК". Кроме того, вы можете использовать Проводник Windows для перехода к соответствующей папке и дважды щелкнуть файл aspnet_regsql.exe. Любой подход будет иметь одинаковые результаты.

Запуск средства aspnet_regsql.exe без каких-либо аргументов командной строки запускает графический пользовательский интерфейс мастера установки SQL Server ASP.NET. Мастер упрощает добавление или удаление служб приложений ASP.NET в указанной базе данных. Первый экран мастера, показанный на рис. 7, описывает назначение средства.

с помощью мастера установки SQL Server ASP.NET, чтобы добавить схему членства

рис. 7. С помощью мастера настройки SQL Server ASP.NET можно добавить схему членства (Щелкните, чтобы просмотреть полноразмерное изображение)

Второй шаг мастера спрашивает, нужно ли добавлять службы приложений или удалять их. Так как мы хотим добавить таблицы, представления и хранимые процедуры, необходимые для SqlMembershipProvider, выберите параметр "Настройка SQL Server для служб приложений". Позже, если вы хотите удалить эту схему из базы данных, повторно запустите этот мастер, но вместо этого выберите пункт "Удалить сведения о службах приложений" из существующей базы данных.

выберите параметр настройки SQL Server для служб приложений

рис. 8. Выберите параметр "Настройка SQL Server для служб приложений" (Щелкните, чтобы просмотреть изображение полного размера)

Третий шаг запрашивает сведения о базе данных: имя сервера, сведения о проверке подлинности и имя базы данных. Если вы выполнили следующие действия вместе с этим руководством и добавили базу данных SecurityTutorials.mdf в App_Data, подключили ее к localhost\InstanceNameи переименовали ее в SecurityTutorialsDatabase, а затем используйте следующие значения:

  • Сервер: localhost\InstanceName
  • Проверка подлинности Windows
  • База данных: SecurityTutorialsDatabase

Введите сведения о базе данных

рис. 9: введите сведения о базе данных (Щелкните, чтобы просмотреть изображение полного размера)

После ввода сведений о базе данных нажмите кнопку "Далее". Последний шаг содержит сводку по шагам, которые будут выполнены. Нажмите кнопку "Далее", чтобы установить службы приложений и завершить работу мастера.

Заметка

Если вы использовали Management Studio для подключения базы данных и переименования файла базы данных, не забудьте отсоединить базу данных и закрыть Management Studio перед повторным открытием Visual Studio. Чтобы отключить базу данных SecurityTutorialsDatabase, щелкните правой кнопкой мыши имя базы данных и в меню "Задачи" выберите "Отсоединить".

По завершении мастера вернитесь в Visual Studio и перейдите в Обозреватель баз данных. Разверните папку "Таблицы". Вы увидите ряд таблиц, имена которых начинаются с префикса aspnet_. Аналогичным образом, в папках "Представления и хранимые процедуры" можно найти различные представления и хранимые процедуры. Эти объекты базы данных составляют схему служб приложений. Мы рассмотрим объекты базы данных для членства и ролей на шаге 3.

в базу данных добавлены различные таблицы, представления и хранимые процедуры.

рис. 10: в базу данных добавлены различные таблицы, представления и хранимые процедуры (щелкните, чтобы просмотреть изображение полного размера)

Заметка

Графический пользовательский интерфейс средства aspnet_regsql.exe устанавливает всю схему служб приложений. Но при выполнении aspnet_regsql.exe из командной строки можно указать, какие компоненты служб приложений необходимо установить (или удалить). Поэтому, если вы хотите добавить только таблицы, представления и хранимые процедуры, необходимые для поставщиков SqlMembershipProvider и SqlRoleProvider, запустите aspnet_regsql.exe из командной строки. Кроме того, можно вручную запустить соответствующее подмножество скриптов для создания T-SQL, используемых aspnet_regsql.exe. Эти скрипты находятся в папке WINDIR%\Microsoft.Net\Framework\v2.0.50727\ с именами, такими как InstallCommon.sql, InstallMembership.sql, InstallRoles.sql, InstallProfile.sql, InstallSqlState.sqlи т. д.

На этом этапе мы создали объекты базы данных, необходимые для SqlMembershipProvider. Однако нам по-прежнему необходимо указать платформу членства, что она должна использовать SqlMembershipProvider (а не, скажем, ActiveDirectoryMembershipProvider) и что SqlMembershipProvider должны использовать базу данных SecurityTutorials. Мы рассмотрим, как указать, какой поставщик следует использовать и как настроить параметры выбранного поставщика на шаге 4. Но сначала давайте рассмотрим только что созданные объекты базы данных.

Шаг 3. Просмотр основных таблиц схемы

При работе с платформами членства и ролей в приложении ASP.NET сведения о реализации инкапсулируются поставщиком. В будущих руководствах мы будем взаимодействовать с этими платформами через классы Membership и Roles фреймворка .NET Framework. При использовании этих высокоуровневых API нам не нужно беспокоиться о низкоуровневых деталях, таких как выполняемые запросы и изменяемые таблицы по SqlMembershipProvider и SqlRoleProvider.

Учитывая это, мы можем уверенно использовать платформы членства и ролей, не изучая схему базы данных, созданную на шаге 2. Однако при создании таблиц для хранения данных приложения может потребоваться создать сущности, связанные с пользователями или ролями. Знание схем SqlMembershipProvider и SqlRoleProvider полезно при установке ограничений внешних ключей между таблицами данных приложения и таблицами, созданными на этапе 2. Кроме того, в некоторых редких случаях может потребоваться взаимодействовать с пользовательскими и ролевыми хранилищами напрямую на уровне базы данных (вместо использования классов Membership или Roles).

Секционирование хранилища пользователей в приложения

Платформы членства и ролей предназначены таким образом, чтобы один пользователь и хранилище ролей можно совместно использовать между различными приложениями. Приложение ASP.NET, использующее платформы членства или ролей, должно указать, какую секцию приложения следует использовать. Короче говоря, несколько веб-приложений могут использовать одно и то же хранилище пользователей и ролей. На рисунке 11 показаны хранилища пользователей и ролей, разделенные на три приложения: HRSite, CustomerSite и SalesSite. Эти три веб-приложения имеют собственных уникальных пользователей и ролей, но все они физически хранят свою учетную запись пользователя и сведения о роли в одной таблице базы данных.

учетные записи пользователей могут быть секционированы по нескольким приложениям

рис. 11. Учетные записи пользователей могут быть секционированы по нескольким приложениям (Щелкните, чтобы просмотреть изображение полного размера)

Таблица aspnet_Applications определяет эти разделы. Каждое приложение, использующее базу данных для хранения сведений об учетной записи пользователя, представлено строкой в этой таблице. Таблица aspnet_Applications содержит четыре столбца: ApplicationId, ApplicationName, LoweredApplicationNameи Description. ApplicationId имеет тип uniqueidentifier и является первичным ключом таблицы; ApplicationName предоставляет уникальное понятное имя для каждого приложения.

Другие таблицы, связанные с членством и ролью, возвращаются к полю ApplicationId в aspnet_Applications. Например, таблица aspnet_Users, содержащая запись для каждой учетной записи пользователя, имеет поле внешнего ключа ApplicationId; то же самое для таблицы aspnet_Roles. Поле ApplicationId в этих таблицах указывает секцию приложения, к которой принадлежит учетная запись пользователя или роль.

Хранение сведений о учетной записи пользователя

Сведения об учетной записи пользователя размещаются в двух таблицах: aspnet_Users и aspnet_Membership. Таблица aspnet_Users содержит поля, содержащие необходимые сведения о учетной записи пользователя. Ниже приведены три наиболее подходящих столбца:

  • UserId
  • UserName
  • ApplicationId

UserId является первичным ключом (а его тип — uniqueidentifier). UserName является типом nvarchar(256) и вместе с паролем составляет учетные данные пользователя. (Пароль пользователя хранится в таблице aspnet_Membership.) ApplicationId связывает учетную запись пользователя с определенным приложением в aspnet_Applications. Существует составное ограничение UNIQUE для столбцов UserName и ApplicationId. Это гарантирует, что в данном приложении каждое имя пользователя уникально, но позволяет использовать одинаковые UserName в разных приложениях.

В таблице aspnet_Membership содержатся дополнительные сведения об учетной записи пользователя, например пароль пользователя, адрес электронной почты, дата и время последнего входа и т. д. Между записями в таблице aspnet_Users и таблице aspnet_Membership существует однозначное соответствие. Эта связь обеспечивается полем UserId в aspnet_Membership, которое служит первичным ключом таблицы. Как и в таблице aspnet_Users, aspnet_Membership включает поле ApplicationId, которое связывает эти сведения с определенным разделом приложения.

Защита паролей

Сведения о пароле хранятся в таблице aspnet_Membership. SqlMembershipProvider позволяет хранить пароли в базе данных с помощью одного из следующих трех методов:

  • Clear — пароль хранится в базе данных в виде обычного текста. Я настоятельно не советую использовать этот вариант. Если база данных скомпрометирована — будь то хакер, который находит черный ход, или недовольный сотрудник, имеющий доступ к базе данных, — учетные данные каждого пользователя могут быть похищены.
  • Хэшированные — пароли хэшируются с помощью односторонного хэш-алгоритма и случайно созданного значения соли. Это хэшированное значение (вместе с солью) хранится в базе данных.
  • Зашифрованный — зашифрованная версия пароля хранится в базе данных.

Используемый метод хранения паролей зависит от параметров SqlMembershipProvider, указанных в Web.config. Мы рассмотрим настройку параметров SqlMembershipProvider на шаге 4. Поведение по умолчанию заключается в хранении хэша пароля.

Столбцы, ответственные за хранение пароля, Password, PasswordFormatи PasswordSalt. PasswordFormat — это поле типа int, значение которого указывает метод, используемый для хранения пароля: 0 для Clear; 1 для хэшированных; 2 для зашифрованного. PasswordSalt назначается случайно созданной строкой независимо от используемого метода хранения паролей; значение PasswordSalt используется только при вычислении хэша пароля. Наконец, столбец Password содержит фактические данные паролей, будь то обычный текстовый пароль, хэш пароля или зашифрованный пароль.

В таблице 1 показано, как выглядят три столбца для различных методов хранения при хранении пароля MySecret! .

Техника хранения <_o3a_p или> пароль<_o3a_p /> PasswordFormat<_o3a_p /> PasswordSalt<_o3a_p />
Ясный MySecret! 0 tTnkPlesqissc2y2SMEygA==
хэшированы 2oXm6sZHWbTHFgjgkGQsc2Ec9ZM= 1 wFgjUfhdUFOCKQiI61vtiQ==
Зашифрованные 62RZgDvhxykkqsMchZ0Yly7HS6onhpaoCYaRxV8g0F4CW56OXUU3e7Inza9j9BKp 2 LSRzhGS/aa/oqAXGLHJNBw==

в таблице 1: примерные значения полей Password-Related при сохранении пароля MySecret!

Заметка

Определенный алгоритм шифрования или хэширования, используемый SqlMembershipProvider, определяется параметрами элемента <machineKey>.

Хранение ролей и ассоциаций ролей

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

  • RoleId
  • RoleName
  • ApplicationId

RoleId является первичным ключом (и имеет тип uniqueidentifier). RoleName имеет тип nvarchar(256). А ApplicationId связывает учетную запись пользователя с определенным приложением в aspnet_Applications. Существует составное ограничение UNIQUE для столбцов RoleName и ApplicationId, что гарантирует уникальность имени каждой роли в данном приложении.

Таблица aspnet_UsersInRoles служит сопоставлением между пользователями и ролями. Существует только два столбца - UserId и RoleId - и вместе они составляют составной первичный ключ.

Шаг 4. Указание поставщика и настройка параметров

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

Класс Membership имеет свойство Providers, содержащее ссылку на все зарегистрированные классы поставщиков, доступные для использования платформой Членства. У каждого зарегистрированного поставщика есть ассоциированное имя и тип. Имя предлагает удобный для человека способ ссылаться на определенного поставщика в коллекции Providers, а тип определяет класс поставщика. Кроме того, каждый зарегистрированный поставщик может включать параметры конфигурации. Параметры конфигурации для платформы членства включают PasswordFormat и requiresUniqueEmail, среди прочего. Полный список параметров конфигурации, используемых SqlMembershipProvider, см. в таблице 2.

Содержимое свойства Providers указывается с помощью параметров конфигурации веб-приложения. По умолчанию все веб-приложения имеют поставщика с именем AspNetSqlMembershipProvider типа SqlMembershipProvider. Этот поставщик членства по умолчанию зарегистрирован в machine.config (расположен в %WINDIR%\Microsoft.Net\Framework\v2.0.50727\CONFIG):

Предупреждение

Похоже, образец, который вы ищете, был перемещён! Будьте уверены, что мы работаем над решением этого.

Как показано выше, элемент <membership> определяет параметры конфигурации платформы Членства, а дочерний элемент <providers> указывает зарегистрированных поставщиков. Поставщики могут быть добавлены или удалены с помощью элементов <add> или <remove>; используйте элемент <clear> для удаления всех зарегистрированных поставщиков. Как показано на разметке выше, machine.config добавляет провайдера с именем AspNetSqlMembershipProvider типа SqlMembershipProvider.

Помимо атрибутов name и type элемент <add> содержит атрибуты, определяющие значения для различных параметров настройки. В таблице 2 перечислены доступные параметры конфигурации SqlMembershipProvider, а также описание каждого.

Заметка

Все значения по умолчанию, указанные в таблице 2, ссылаются на значения по умолчанию, определенные в классе SqlMembershipProvider. Обратите внимание, что не все параметры конфигурации в AspNetSqlMembershipProvider соответствуют значениям по умолчанию класса SqlMembershipProvider. Например, если настройка requiresUniqueEmail не указана в конфигурации поставщика членства, её значение по умолчанию — true. Однако AspNetSqlMembershipProvider переопределяет это значение по умолчанию, явно указывая значение false.

настройка<_o3a_p /> описание<_o3a_p />
ApplicationName Помните, что платформа членства позволяет секционировать одно пользовательское хранилище между несколькими приложениями. Этот параметр указывает имя секции приложения, используемой поставщиком членства. Если это значение не указано явным образом, оно устанавливается во время выполнения в значение виртуального корневого пути приложения.
commandTimeout Указывает значение времени ожидания команды SQL (в секундах). Значение по умолчанию — 30.
connectionStringName Имя строки подключения в элементе <connectionStrings>, используемого для подключения к базе данных хранилища пользователей. Это значение является обязательным.
description Предоставляет понятное описание зарегистрированного поставщика.
enablePasswordRetrieval Указывает, могут ли пользователи получить свой забытый пароль. Значение по умолчанию — false.
enablePasswordReset Указывает, разрешено ли пользователям сбрасывать пароль. По умолчанию используется true.
maxInvalidPasswordAttempts Максимальное количество неудачных попыток входа, которые могут возникнуть для данного пользователя во время указанного passwordAttemptWindow до блокировки пользователя. Значение по умолчанию — 5.
minRequiredNonalphanumericCharacters Минимальное количество символов, не являющихся буквенно-цифровыми символами, которые должны отображаться в пароле пользователя. Это значение должно быть от 0 до 128; Значение по умолчанию — 1.
minRequiredPasswordLength Минимальное количество символов, необходимых в пароле. Это значение должно быть от 0 до 128; Значение по умолчанию — 7.
name Имя зарегистрированного поставщика. Это значение является обязательным.
passwordAttemptWindow Количество минут, в течение которых отслеживаются неудачные попытки входа. Если пользователь предоставляет недопустимые учетные данные входа maxInvalidPasswordAttempts раз в этом указанном окне, они заблокированы. Значение по умолчанию — 10.
PasswordFormat Формат хранилища паролей: Clear, Hashedили Encrypted. Значение по умолчанию — Hashed.
passwordStrengthRegularExpression Если это указано, это регулярное выражение используется для оценки силы выбранного пароля пользователя при создании новой учетной записи или при изменении пароля. Значение по умолчанию — пустая строка.
requiresQuestionAndAnswer Указывает, должен ли пользователь отвечать на свой вопрос безопасности при получении или сбросе пароля. Значение по умолчанию — true.
requiresUniqueEmail Указывает, должны ли все учетные записи пользователей в заданном разделе приложения иметь уникальный адрес электронной почты. Значение по умолчанию — true.
type Указывает тип поставщика. Это значение является обязательным.

Таблица 2: Настройки членства и конфигурации SqlMembershipProvider

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

Заметка

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

Настройка параметровSqlMembershipProvider

SqlMembershipProvider по умолчанию (AspNetSqlMembershipProvider) имеет атрибут connectionStringName, установленный на LocalSqlServer. Подобно поставщику AspNetSqlMembershipProvider, имя строки подключения LocalSqlServer задаётся в machine.config.

Предупреждение

Похоже, образец, который вы ищете, был перемещен! Будьте уверены, что мы работаем над решением этого.

Как видно, эта строка подключения определяет базу данных SQL 2005 Express Edition, расположенную по адресу |DataDirectory|aspnetdb.mdf. Строка |DataDirectory| преобразуется во время выполнения, чтобы указать каталог ~/App_Data/, поэтому путь к базе данных |DataDirectory|aspnetdb.mdf преобразуется в ~/App_Data/aspnet.mdf.

Если в файле Web.config приложения нет сведений о поставщике членства, приложение использует зарегистрированного поставщика членства по умолчанию, AspNetSqlMembershipProvider. Если база данных ~/App_Data/aspnet.mdf не существует, среда выполнения ASP.NET автоматически создаст ее и добавит схему служб приложений. Однако мы не хотим использовать базу данных aspnet.mdf; вместо этого мы хотим использовать базу данных SecurityTutorials.mdf, созданную на шаге 2. Это изменение можно выполнить одним из двух способов:

  • Укажите значение для имени строки подключенияLocalSqlServerвWeb.config. Путем перезаписи значения имени строки подключения LocalSqlServer в Web.configмы можем использовать зарегистрированный поставщик членства по умолчанию (AspNetSqlMembershipProvider) и правильно работать с базой данных SecurityTutorials.mdf. Этот подход подходит, если вы довольны параметрами конфигурации, указанными в AspNetSqlMembershipProvider. Дополнительные сведения об этом методе см. в записи блога Скотта Гатринастройке служб приложений ASP.NET 2.0 для использования SQL Server 2000 или SQL Server 2005.
  • Добавить нового зарегистрированного поставщика типаSqlMembershipProviderи настроить его параметрconnectionStringName, чтобы указать на базу данныхSecurityTutorials.mdf. этот подход полезен в сценариях, где вы хотите настроить другие свойства конфигурации в дополнение к строке подключения к базе данных. В моих собственных проектах я всегда использую этот подход из-за его гибкости и удобочитаемости.

Первым делом необходимо добавить правильное значение строки подключения в разделе <connectionStrings> в Web.config, прежде чем добавлять нового зарегистрированного поставщика, ссылающегося на базу данных SecurityTutorials.mdf. Следующая разметка добавляет новую строку подключения с именем SecurityTutorialsConnectionString, которая ссылается на базу данных SQL Server 2005 Express Edition SecurityTutorials.mdf в папке App_Data.

Предупреждение

Похоже, нужный вам образец был перемещён! Будьте уверены, что мы работаем над решением этого.

Заметка

Если вы используете альтернативный файл базы данных, обновите строку подключения по мере необходимости. Дополнительные сведения о формировании правильной строки подключения см. в ConnectionStrings.com.

Затем добавьте следующую разметку конфигурации членства в файл Web.config. Эта разметка регистрирует нового поставщика с именем SecurityTutorialsSqlMembershipProvider.

Предупреждение

Похоже, образец, который вы ищете, был перемещён! Будьте уверены, что мы работаем над решением этого.

Помимо регистрации поставщика SecurityTutorialsSqlMembershipProvider, приведённая выше разметка определяет SecurityTutorialsSqlMembershipProvider как поставщика по умолчанию (через атрибут defaultProvider в элементе <membership>). Помните, что платформа членства может иметь несколько зарегистрированных поставщиков. Так как AspNetSqlMembershipProvider зарегистрирован в качестве первого поставщика в machine.config, он служит поставщиком по умолчанию, если не указано в противном случае.

В настоящее время в нашем приложении есть два зарегистрированных поставщика: AspNetSqlMembershipProvider и SecurityTutorialsSqlMembershipProvider. Однако перед регистрацией поставщика SecurityTutorialsSqlMembershipProvider мы могли бы удалить всех ранее зарегистрированных поставщиков, добавив элемент <clear /> непосредственно перед нашим элементом <add>. Это позволит очистить AspNetSqlMembershipProvider из списка зарегистрированных поставщиков, то есть SecurityTutorialsSqlMembershipProvider будет единственным зарегистрированным поставщиком членства. Если бы мы использовали этот подход, то нам не нужно пометить SecurityTutorialsSqlMembershipProvider как поставщик по умолчанию, так как он будет единственным зарегистрированным поставщиком членства. Дополнительные сведения об использовании <clear />см. в разделе Использование <clear /> при добавлении поставщиков.

Обратите внимание, что настройка connectionStringName в SecurityTutorialsSqlMembershipProviderссылается на только что добавленное имя строки подключения SecurityTutorialsConnectionString и что для настройки applicationName установлено значение SecurityTutorials. Кроме того, для параметра requiresUniqueEmail задано значение true. Все остальные параметры конфигурации идентичны значениям в AspNetSqlMembershipProvider. Если вы хотите, вы можете внести любые изменения конфигурации. Например, можно ужесточить силу пароля, требуя двух небуквенно-цифровых символов, а не одного, или путем увеличения длины пароля до восьми символов вместо семи.

Заметка

Помните, что платформа членства позволяет секционировать одно пользовательское хранилище между несколькими приложениями. Параметр applicationName поставщика членства указывает, какое приложение используется поставщиком при работе с хранилищем пользователей. Важно явно задать значение для параметра конфигурации applicationName, так как если applicationName не задан явным образом, он назначается виртуальному корневому пути веб-приложения во время выполнения. Это работает хорошо, пока виртуальный корневой путь приложения не изменяется, но если переместить приложение в другой путь, то параметр applicationName также изменится. В этом случае поставщик членства начнет работать с другим разделом приложения, чем раньше. Учетные записи пользователей, созданные до перемещения, будут находиться в другом разделе приложения, и эти пользователи больше не смогут войти на сайт. Дополнительные сведения об этом вопросе см. в статье Always Set the applicationName Property When configuring ASP.NET 2.0 Membership and Other providers.

Сводка

На этом этапе у нас есть база данных с настроенными службами приложений (SecurityTutorials.mdf) и настроили веб-приложение таким образом, чтобы платформа членства использовала только что зарегистрированного поставщика SecurityTutorialsSqlMembershipProvider. Этот зарегистрированный поставщик имеет тип SqlMembershipProvider, у него connectionStringName установлено на соответствующую строку подключения (SecurityTutorialsConnectionString), а значение applicationName явно задано.

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

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

Дальнейшее чтение

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

Учебный видеоролик по темам, содержащимся в этом руководстве

Сведения о авторе

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

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

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