Создание схемы членства в 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
в эту базу данных; в последующих руководствах мы создадим дополнительные таблицы для сбора данных приложения.
Рис. 1. Добавление новой База данных SQL именованной SecurityTutorials.mdf
базы данных в папку App_Data
(щелкните для просмотра полноразмерного изображения)
При добавлении базы данных в папку App_Data
она автоматически включается в представление Обозреватель базы данных. (В версии Visual Studio, отличной от Express Edition, Обозреватель базы данных называется серверной Обозреватель.) Перейдите к Обозреватель база данных и разверните только что добавленную SecurityTutorials
базу данных. Если Обозреватель базы данных не отображается на экране, перейдите в меню Вид и выберите Обозреватель базы данных или нажмите клавиши CTRL+ALT+S. Как показано на рисунке SecurityTutorials
2, база данных пуста: она не содержит ни таблиц, ни представлений, ни хранимых процедур.
Рис. 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.
Рис. 3. Подключение к экземпляру SQL Server 2005, экспресс-выпуск (щелкните для просмотра полноразмерного изображения)
После подключения к экземпляру SQL Server 2005, экспресс-выпуск среда Management Studio отображает папки для баз данных, параметров безопасности, объектов сервера и т. д. Если развернуть вкладку Базы данных, вы увидите, что SecurityTutorials.mdf
база данных не зарегистрирована в экземпляре базы данных. Сначала необходимо подключить базу данных.
Щелкните правой кнопкой мыши папку Базы данных и выберите в контекстном меню команду Присоединить. Откроется диалоговое окно Присоединение баз данных. Здесь нажмите кнопку Добавить, перейдите к SecurityTutorials.mdf
базе данных и нажмите кнопку ОК. На рисунке 4 показано диалоговое окно Присоединение SecurityTutorials.mdf
баз данных после выбора базы данных. На рисунке 5 показана обозреватель объектов Management Studio после успешного подключения базы данных.
Рис. 4. Присоединение SecurityTutorials.mdf
базы данных (щелкните для просмотра полноразмерного изображения)
Рис. 5. База SecurityTutorials.mdf
данных отображается в папке "Базы данных" (щелкните для просмотра полноразмерного изображения)
Как показано на рисунке SecurityTutorials.mdf
5, база данных имеет довольно заумное имя. Давайте изменим его на более запоминающееся (и более удобное для ввода) имя. Щелкните правой кнопкой мыши базу данных, выберите в контекстном меню пункт Переименовать и переименуйте ее SecurityTutorialsDatabase
. Это не изменяет имя файла, а только имя базы данных, используемое для идентификации себя для SQL Server.
Рис. 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, описывается назначение средства.
Рис. 7. Добавление схемы членства с помощью мастера настройки ASP.NET SQL Server (щелкните, чтобы просмотреть полноразмерное изображение)
На втором шаге мастера нам будет показано, нужно ли добавить службы приложений или удалить их. Так как мы хотим добавить таблицы, представления и хранимые процедуры, необходимые SqlMembershipProvider
для , выберите параметр Настроить 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 сведения о реализации инкапсулируются поставщиком. В будущих руководствах мы будем использовать эти платформы с помощью классов и платформа .NET Framework Membership
Roles
. При использовании этих высокоуровневых 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 />
при добавлении поставщиков.
Обратите внимание, что SecurityTutorialsSqlMembershipProvider
connectionStringName
параметр ссылается на только что добавленное 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
значение явно задано.
Теперь мы готовы использовать платформу членства из нашего приложения. В следующем руководстве мы рассмотрим, как создавать новые учетные записи пользователей. После этого мы рассмотрим проверку подлинности пользователей, авторизацию на основе пользователей и хранение дополнительных сведений, связанных с пользователем, в базе данных.
Счастливого программирования!
Дополнительные материалы
Дополнительные сведения о темах, рассмотренных в этом руководстве, см. в следующих ресурсах:
- Всегда задается
applicationName
свойство при настройке членства ASP.NET 2.0 и других поставщиков - Настройка служб приложений ASP.NET 2.0 для использования SQL Server 2000 или SQL Server 2005
- Скачать SQL Server Management Studio
- Изучение членства, ролей и профиля ASP.NET 2.0s
- Элемент
<add>
для поставщиков для членства - Элемент
<membership>
- Элемент
<providers>
для членства - Использование
<clear />
при добавлении поставщиков - Работа непосредственно с
SqlMembershipProvider
Видеоурок по темам, содержащимся в этом руководстве
Об авторе
Скотт Митчелл(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.
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по