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

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

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

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

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

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

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

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

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

Примечание

В этой серии руководств мы будем использовать базу данных Microsoft SQL Server 2005, экспресс-выпуск для хранения таблиц приложений SqlMembershipProvider и схемы. Это решение было принято по двум причинам: во-первых, из-за стоимости (бесплатно) Express Edition является наиболее удобочитаемой доступной версией SQL Server 2005; во-вторых, SQL Server 2005, экспресс-выпуск базы данных могут размещаться непосредственно в веб-приложенииApp_Data. папка, что делает ее cinch для упаковки базы данных и веб-приложения в один 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. Как показано на рисунке SecurityTutorials 2, база данных пуста: она не содержит ни таблиц, ни представлений, ни хранимых процедур.

База данных 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 на котором находится база данных, учетные данные безопасности для подключения к базе данных и имя базы данных. Если вы используете выпуск SQL Server, отличный от Express, вы уже должны знать эти сведения, так как это те же сведения, которые необходимо предоставить через строка подключения при работе с базой данных через веб-страницу ASP.NET. Однако определение имени сервера и базы данных при использовании SQL Server 2005, экспресс-выпуск базы данных в App_Data папке немного сложнее.

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

Определение сервера и имени базы данных для базы данных SQL Server 2005, экспресс-выпуск в папкеApp_Data

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

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

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

Примечание

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

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

Подключение к экземпляру SQL Server 2005, экспресс-выпуск

Рис. 3. Подключение к экземпляру SQL Server 2005, экспресс-выпуск (щелкните для просмотра полноразмерного изображения)

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

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

Присоединение базы данных SecurityTutorials.mdf

Рис. 4. Присоединение SecurityTutorials.mdf базы данных (щелкните для просмотра полноразмерного изображения)

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

Рис. 5. База SecurityTutorials.mdf данных отображается в папке "Базы данных" (щелкните для просмотра полноразмерного изображения)

Как показано на рисунке SecurityTutorials.mdf 5, база данных имеет довольно заумное имя. Давайте изменим его на более запоминающееся (и более удобное для ввода) имя. Щелкните правой кнопкой мыши базу данных, выберите в контекстном меню пункт Переименовать и переименуйте ее 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 При запуске средства без аргументов командной строки запускается графический пользовательский интерфейс мастера установки ASP.NET SQL Server. Мастер упрощает добавление или удаление ASP.NET служб приложений в указанной базе данных. На первом экране мастера, показанном на рис. 7, описывается назначение средства.

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

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

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

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

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

На третьем шаге запрашивается информация о базе данных: имя сервера, сведения о проверке подлинности и имя базы данных. Если вы выполнили инструкции из этого руководства и добавили базу данных в SecurityTutorials.mdfApp_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.sqlInstallSqlState.sql, и т. д.

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

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

При работе с платформами членства и ролей в приложении ASP.NET сведения о реализации инкапсулируются поставщиком. В будущих руководствах мы будем использовать эти платформы с помощью классов и платформа .NET Framework MembershipRoles. При использовании этих высокоуровневых 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 поле внешнего ключа; ditto для aspnet_Roles таблицы. Поле ApplicationId в этих таблицах указывает, к какому разделу приложения принадлежит учетная запись пользователя или роль.

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

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

  • UserId
  • UserName
  • ApplicationId

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

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

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

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

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

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

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

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

Метод< хранения_o3a_p /> Пароль<_o3a_p /> PasswordFormat<_o3a_p /> PasswordSalt<_o3a_p />
Clear 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. Для столбцов и ApplicationId существует составное UNIQUE ограничениеRoleName, гарантирующее уникальность каждого имени роли в данном приложении.

Таблица 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 name="AspNetSqlMembershipProvider"
 type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" 
 connectionStringName="LocalSqlServer"
 enablePasswordRetrieval="false"
 enablePasswordReset="true"
 requiresQuestionAndAnswer="true"
 applicationName="/"
 requiresUniqueEmail="false"
 passwordFormat="Hashed"
 maxInvalidPasswordAttempts="5"
 minRequiredPasswordLength="7"
 minRequiredNonalphanumericCharacters="1"
 passwordAttemptWindow="10"
 passwordStrengthRegularExpression=""/>
 </providers> 
</membership>

Как показано в приведенной выше разметке<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.

<connectionStrings> 
 <add name="LocalSqlServer" 
 connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" 
 providerName="System.Data.SqlClient"/> 
</connectionStrings>

Как видите, этот строка подключения определяет базу данных 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, экспресс-выпуск SecurityTutorials.mdf в папке App_Data .

<configuration>
 <connectionStrings>
 <add name="SecurityTutorialsConnectionString" 
 connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\SecurityTutorials.mdf;Integrated Security=True;User Instance=True" 
 providerName="System.Data.SqlClient"/>
 </connectionStrings> 
 <system.web>
 ... Configuration markup removed for brevity ...  </system.web>
</configuration>

Примечание

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

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

<configuration>
 <connectionStrings>
 <add name="SecurityTutorialsConnectionString" 
 connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\SecurityTutorials.mdf;Integrated Security=True;User Instance=True" 
 providerName="System.Data.SqlClient"/>
 </connectionStrings> 
 <system.web>
 <membership defaultProvider="SecurityTutorialsSqlMembershipProvider">
 <providers>
 <!-- Add a customized SqlMembershipProvider --> 
 <add name="SecurityTutorialsSqlMembershipProvider" 
 type="System.Web.Security.SqlMembershipProvider"
 connectionStringName="SecurityTutorialsConnectionString"
 enablePasswordRetrieval="false"
 enablePasswordReset="true"
 requiresQuestionAndAnswer="true"
 applicationName="SecurityTutorials"
 requiresUniqueEmail="true"
 passwordFormat="Hashed"
 maxInvalidPasswordAttempts="5"
 minRequiredPasswordLength="7"
 minRequiredNonalphanumericCharacters="1"
 passwordAttemptWindow="10"
 passwordStrengthRegularExpression=""/>
 </providers>
 </membership>
 ... Configuration markup removed for brevity ... 
 </system.web>
</configuration>

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

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

Обратите внимание, что SecurityTutorialsSqlMembershipProviderconnectionStringName параметр ссылается на только что добавленное 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 значение явно задано.

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

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

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

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

Видеоурок по темам, содержащимся в этом руководстве

Об авторе

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

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

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