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

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

Примечание

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

До 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 Edition, вы уже должны знать эти сведения, так как это те же сведения, которые необходимо предоставить через строка подключения при работе с базой данных через веб-страницу 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 edition SQL Server 2005. Хорошей новостью является то, что вы можете скачать бесплатный Экспресс-выпуск 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, экспресс-выпуск. Как отмечалось ранее, скорее всего, имя экземпляра — 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.

Переименование базы данных в SecurityTutorialsБаза данных

Рис. 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 для служб приложений. Если вы хотите удалить эту схему из базы данных, повторно запустите этот мастер, но вместо этого выберите параметр Удалить сведения о службах приложений из существующей базы данных.

Выбор параметра Configure SQL Server for Application Services (Настройка SQL Server для служб приложений)

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

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

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

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

При работе с платформами членства и ролей в приложении ASP.NET сведения о реализации инкапсулируются поставщиком. В будущих руководствах мы будем использовать эти платформы через классы и Roles платформа .NET FrameworkMembership. При использовании этих высокоуровневых 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. Существует составное UNIQUE ограничение для столбцов UserName и ApplicationId . Это гарантирует, что в данном приложении каждое имя пользователя является уникальным, но позволяет использовать одно и то же 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. Существует составное 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 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.