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


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

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

Заметка

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

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

Скачать код или скачать в формате PDF

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

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

Шаг 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, но SQL Server Management Studio не входит в состав версии Express 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, как фреймворк 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. этот подход полезен в сценариях, где вы хотите настроить другие свойства конфигурации в дополнение к строке подключения к базе данных. В моих собственных проектах я всегда использую этот подход из-за его гибкости и удобочитаемости.

Прежде чем добавить нового зарегистрированного поставщика, ссылающегося на базу данных SecurityTutorials.mdf, сначала необходимо добавить соответствующее значение строки подключения в разделе <connectionStrings> в Web.config. Следующая разметка добавляет новую строку подключения с именем 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 /> при добавлении поставщиков».

Обратите внимание, что параметр connectionStringNameSecurityTutorialsSqlMembershipProviderссылается на только что добавленное имя строки подключения 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 Teach Yourself ASP.NET 2.0 за 24 часа. Со Скоттом можно связаться по mitchell@4guysfromrolla.com или через его блог на http://ScottOnWriting.NET.

Особое спасибо кому

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