Создание схемы членства в 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
в эту базу данных; в последующих руководствах мы создадим дополнительные таблицы для записи данных приложения.
Рис. 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 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.
Рис. 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 для служб приложений (щелкните для просмотра полноразмерного изображения)
На третьем шаге запрашивается информация о базе данных: имя сервера, сведения о проверке подлинности и имя базы данных. Если вы выполнили действия с этим руководством и добавили базу данных 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.sql
InstallProfile.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 />
при добавлении поставщиков.
Обратите внимание, что 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.0
- Элемент
<add>
для providers for Membership - Элемент
<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 как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по