Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Замечание
С момента написания этой статьи провайдеры членства ASP.NET были заменены посредством ASP.NET Identity. Настоятельно рекомендуется обновить приложения для использования платформы ASP.NET identity, а не поставщиков членства, которые были представлены в то время, когда эта статья была написана. ASP.NET Identity имеет ряд преимуществ по сравнению с системой членства ASP.NET, в том числе:
- Улучшенная производительность
- Улучшенная расширяемость и возможность тестирования
- Поддержка OAuth, OpenID Connect и двухфакторной проверки подлинности
- Поддержка удостоверений на основе утверждений
- Улучшение взаимодействия с ASP.Net Core
ASP.NET Membership опирается на успешную модель проверки подлинности Form из ASP.NET 1.x. проверка подлинности ASP.NET Forms обеспечивает удобный способ внедрения формы входа в приложение ASP.NET и проверки пользователей в базе данных или другом хранилище данных.
ASP.NET членство основывается на успешном выполнении модели проверки подлинности Forms из ASP.NET 1.x. проверка подлинности ASP.NET Forms обеспечивает удобный способ внедрения формы входа в приложение ASP.NET и проверки пользователей в базе данных или другом хранилище данных. Члены класса FormsAuthentication позволяют обрабатывать файлы cookie для проверки подлинности, проверять допустимое имя входа, выходить из системы пользователя и т. д. Однако реализация проверки подлинности forms в приложении ASP.NET 1.x может требовать достаточного количества кода.
Членство в ASP.NET 2.0 является значительным усовершенствованием по сравнению с использованием только проверки подлинности форм. (Членство является наиболее надежным при сочетании с проверкой подлинности форм, но использование проверки подлинности форм не является обязательным.) Как вы увидите в ближайшее время, вы можете использовать элементы управления членством ASP.NET и имена входа в ASP.NET 2.0 для реализации мощной системы членства без написания большого количества кода.
Реализация членства в ASP.NET 2.0
Членство реализуется следующими четырьмя шагами. Помните, что существует множество вложенных шагов, которые участвуют, а также необязательная конфигурация, которую также можно реализовать. Эти шаги призваны проиллюстрировать большую картину настройки членства.
Создайте базу данных членства (если SQL Server используется в качестве хранилища членства.)
Укажите параметры членства в файлах конфигурации приложений. (Членство включено по умолчанию.)
Определите тип хранилища членства, который вы хотите использовать. Доступны следующие варианты:
- Microsoft SQL Server (версия 7.0 или более поздней версии)
- Магазин Active Directory
- Настраиваемый поставщик членства
Настройте приложение для проверки подлинности ASP.NET Forms. Членство снова разработано для использования аутентификации через формы, но использование аутентификации через формы не является обязательным.
Определите учетные записи пользователей для членства и настройте роли при необходимости.
Создание базы данных членства
Если вы используете SQL Server 7.0 или более поздней версии в качестве хранилища членства, можно использовать программу aspnet_regsql (доступную наиболее легко из командной строки Visual Studio .NET 2005) для настройки базы данных. Служебная программа aspnet_regsql может использоваться в качестве средства командной строки или с помощью мастера графического интерфейса. Метод мастера — самый простой способ настройки базы данных. Чтобы получить доступ к мастеру, просто выполните следующую команду:
aspnet_regsql W
После выполнения этой команды отобразится мастер установки SQL Server ASP.NET, как показано ниже.
Рис. 1
Мастер установки SQL Server ASP.NET создает веб-сайт в экземпляре, который указан в мастере. Однако ASP.NET будет использовать строку подключения в файле machine.config для подключения к базе данных. По умолчанию эта строка подключения указывает на экземпляр SQL Server 2005, поэтому если вы используете экземпляр SQL Server 2000 или SQL Server 7.0, необходимо изменить строку подключения в файле machine.config. Эта строка подключения может находиться здесь:
<configuration>
<connectionStrings>
<add name="LocalSqlServer"
connectionString="data source=(local);
Integrated Security=SSPI;Initial Catalog=aspnetdb;"
providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>
К сожалению, если вы не измените строку подключения, ASP.NET не выдаст вам подробное сообщение об ошибке. Он будет просто продолжать жаловаться на то, что вы не создали базу данных. В приведенном выше случае я изменил строку подключения, чтобы указать на локальный экземпляр SQL Server 2000.
Спецификация конфигурации и добавление пользователей и ролей
Следующим шагом в настройке членства является добавление необходимых сведений в файл web.config приложения. В ASP.NET 1.x изменение конфигурационного файла web.config иногда было затруднительно из-за использования lowerCamelCase и отсутствия Intellisense. Visual Studio .NET 2005 упрощает задачу с Intellisense для файлов конфигурации, но ASP.NET 2.0 идет еще один шаг, предоставив веб-интерфейс для редактирования файлов конфигурации.
Веб-интерфейс можно запустить, нажав кнопку "Конфигурация ASP.NET" на панели инструментов обозревателя решений, как показано ниже. Вы также можете запустить веб-интерфейс с помощью всплывающих окон, отображаемых при вставке элементов управления входа.
Рис. 2
Откроется средство администрирования веб-сайта ASP.NET, показанное ниже. Администрирование веб-сайта ASP.NET — это интерфейс с четырьмя вкладками, который упрощает управление параметрами приложения. Доступны следующие вкладки.
- дом
- Безопасности Настройте пользователей, роли и доступ.
- Приложения Настройка параметров приложения.
- Поставщик Настройте и проверьте поставщик членства ваших приложений.
Средство администрирования веб-сайта позволяет легко создавать пользователей, создавать новые роли и управлять пользователями и ролями. Эта возможность недоступна в интерфейсе Windows. Интерфейс Windows позволяет легко определять параметры авторизации и добавлять, удалять и управлять поставщиками, возможностями, которые не находятся в средстве администрирования веб-сайта.
Чтобы запустить интерфейс Windows, откройте оснастку "Службы Internet Information Services", щелкните правой кнопкой мыши ваше приложение и выберите "Свойства". Перейдите на вкладку ASP.NET и нажмите кнопку "Изменить конфигурацию". (Для включения кнопки "Изменить конфигурацию" приложение должно выполняться в ASP.NET 2.0. Вы также можете настроить версию ASP.NET в диалоговом окне ASP.NET.) Откроется диалоговое окно параметров конфигурации ASP.NET, как показано ниже.
Рис. 3
На вкладке "Общие" перечислены строки подключения и параметры приложения. Все параметры в курсиве определяются в родительском файле конфигурации (machine.config или web.config на более высоком уровне) и параметры, не в курсиве, находятся в файле конфигурации приложений. Если параметр добавляется, удаляется или редактируется на уровне приложения, ASP.NET добавит, удалит или изменит параметр в файле web.config на уровне приложения, вместо удаления параметра из файла конфигурации, из которого он наследуется.
На вкладке "Проверка подлинности" показана ниже. Здесь вы настроите параметры членства. Параметры проверки подлинности форм, поставщики членства и поставщики ролей можно настроить здесь.
Рис. 4
Внедрение членства в приложении
Самый простой способ реализовать членство ASP.NET 2.0 в приложении — использовать предоставленные элементы управления входа. Этот метод позволяет реализовать основы членства ASP.NET 2.0 без написания кода вообще.
В ASP.NET 2.0 доступны следующие элементы управления входа:
Контроль входа
Элемент управления "Вход" предоставляет интерфейс для входа в систему членства. Он предоставляет текстовое поле имени пользователя и пароля и кнопку входа. Многие другие распространенные функции, такие как ссылка для регистрации для пользователей, которые еще не сделали этого, флажок, позволяющий пользователю автоматически входить в систему при последующих посещениях, ссылку на напоминание о пароле и т. д. Все функции элемента управления входа настраиваются с помощью свойств элемента управления.
В ASP.NET 1.x разработчикам пришлось написать достаточное количество кода, чтобы выполнить поиск при использовании проверки подлинности форм. С помощью ASP.NET членства в версии 2.0 можно проверить пользователей без написания кода вообще. ASP.NET автоматически произведёт поиск пользователя за вас. (Если вы используете элемент управления "Вход" без использования ASP.NET членства, можно использовать метод OnAuthenticate для проверки пользователя.)
Элемент управления LoginView
Элемент управления LoginView — это шаблонный элемент управления, который предоставляет два шаблона по умолчанию; AnonymousTemplate и LoggedInTemplate. Отображаемый шаблон определяется тем, вошел ли пользователь в вашу систему членства или нет. Обычно этот элемент управления используется для отображения элемента управления "Вход", если пользователь еще не вошел в систему и элемент управления LoginStatus и (или) другие элементы управления входа, когда пользователь вошел в систему. Если вы используете управление ролями в приложении ASP.NET, элемент управления LoginView может отобразить определенный шаблон на основе роли пользователей. (Дополнительные сведения об управлении ролями ASP.NET будут рассмотрены позже.)
Элемент управления ВосстановлениеПароля
Элемент управления PasswordRecovery позволяет пользователю получить сообщение электронной почты с его или её текущим паролем или сбросить его. Открытые и зашифрованные пароли могут быть восстановлены и отправлены пользователям по электронной почте. Если пароль хэширован, его невозможно восстановить. Вместо этого пользователю потребуется выполнить сброс пароля.
Элемент управления LoginStatus
Элемент управления LoginStatus используется для отображения индикатора входа пользователям, которые не вошли в систему, и индикатор выхода для пользователей, вошедших в систему. Свойство Request.IsAuthenticated используется для определения индикатора для отображения. Индикатор, отображаемый элементом управления LoginStatus, может быть текстом (реализован с помощью свойств LoginText и LogoutText) или изображений (реализованных с помощью свойств LoginImageUrl и LogoutImageUrl.)
Когда пользователь выходит из системы с помощью элемента управления LoginStatus, он или она перенаправляется по URL-адресу, указанному свойством LogoutPageUrl . Если это свойство не задано, текущая страница обновляется. Так как сайт, скорее всего, защищен проверкой подлинности форм, обновление текущей страницы перенаправит пользователя на страницу входа для сайта.
Элемент управления LoginName
Элемент управления LoginName отображает имя пользователя пользователя, вошедшего на сайт.
Элемент управления «CreateUserWizard»
Элемент управления CreateUserWizard предоставляет пользователям удобный способ регистрации в системе членства. Вы можете добавить шаги (реализованные в виде коллекции wizardSteps) с помощью интерфейса, показанного ниже.
Рис. 5
CreateUserWizard — это шаблонный элемент управления, производный от класса мастера, и предоставляет следующие шаблоны:
- HeaderTemplate Этот шаблон управляет внешним видом заголовка мастера.
- SidebarTemplate Этот шаблон управляет внешним видом боковой панели мастера.
- StartNavigationTemplate Этот шаблон определяет внешний вид навигации мастера на начальном этапе.
- StepNavigationTemplate Этот шаблон определяет внешний вид области навигации, если эта область не находится на начальном или конечном этапе.
- FinishNavigationTemplate Этот шаблон управляет внешним видом области навигации при завершении.
Кроме того, для каждого шага, добавляемого в мастер, ASP.NET создаст пользовательский шаблон, содержащий как ContentTemplate, так и CustomNavigationTemplate для этого шага. Полные сведения о настройке CreateUserWizard см. в документации по VS.NET 2005:
Элемент управления ChangePassword
Элемент управления ChangePassword позволяет пользователям изменять пароль. Если свойство DisplayUserName имеет значение true (по умолчанию имеет значение false), пользователь может изменить пароль, если он не вошел в систему. Если пользователь уже вошел в систему и свойство DisplayUserName имеет значение true, пользователь сможет изменить пароль другого пользователя, который не вошел в систему, указав идентификатор пользователя этого пользователя.
Помните, что если вы хотите, чтобы пользователи могли изменять пароли без необходимости входа, необходимо убедиться, что страница, на которой отображается элемент управления ChangePassword, разрешает анонимный доступ. Очевидно, что пользователям придется предоставить свой старый пароль, чтобы изменить пароль.
Управление ролями
Управление ролями позволяет назначать пользователей определенной роли, а затем ограничивать доступ к определенным файлам или папкам на основе этой роли. Управление ролями также предоставляет API, чтобы вы могли программно определить роль кого-либо или определить всех пользователей в определенной роли и реагировать соответствующим образом.
Управление ролями не является требованием в ASP.NET членстве, а также не является обязательным требованием для использования управления ролями. Тем не менее, эти два дополняют друг друга хорошо, и, скорее всего, разработчики будут использовать их совместно.
Чтобы включить управление ролями в приложении, внесите следующее изменение в файл web.config:
<roleManager enabled="true" cacheRolesInCookie="true" cookieProtection="All" />
Если атрибут cacheRolesInCookie имеет значение true, ASP.NET кэширует членство пользователей в файле cookie на клиенте. Это позволяет выполнять поиск ролей без вызовов в RoleProvider. При использовании этого атрибута разработчикам рекомендуется убедиться, что атрибут cookieProtection имеет значение All. (Это параметр по умолчанию.) Это гарантирует, что данные cookie шифруются и помогают гарантировать, что содержимое файлов cookie не было изменено. Роли можно добавить с помощью средства администрирования веб-сайта. Это позволяет легко определять роли, настраивать доступ к частям сайта на основе этих ролей и назначать пользователям роли.
Рис. 6
Как показано выше, новые роли можно добавить, просто введя имя роли и нажав кнопку "Добавить роль". Существующие роли можно управлять или удалять, щелкнув соответствующую ссылку в списке существующих ролей.
При управлении ролью можно добавить или удалить пользователей, как показано ниже.
Рис. 7
Установив флажок "Пользователь находится в роли", вы можете легко добавить пользователя в определенную роль. ASP.NET автоматически обновит базу данных членства с соответствующими записями. Вы также хотите настроить правила доступа для приложения. ASP.NET разработчики версии 1.x знакомы с этим с помощью <элемента авторизации> в файле web.config, и этот параметр по-прежнему доступен в ASP.NET 2.0. Однако его проще управлять правилами доступа с помощью средства администрирования веб-сайта, как показано ниже.
Рис. 8
В этом случае папка Administration выделена (ее трудно увидеть, так как инструмент выделяет её светло-серым цветом), и к роли администраторов предоставлен доступ. Все остальные пользователи запрещены. Щелкните на значок профиля, чтобы выбрать правило, а затем используйте кнопки «Переместить вверх» и «Переместить вниз» для упорядочивания правил. Как и в случае с элементом авторизации< ASP.NET>, правила обрабатываются в том порядке, в котором они отображаются. Другими словами, если порядок правил в приведенном выше снимке был изменен в обратном порядке, никто не будет иметь доступа к папке Администрирование, так как первым правилом, с которым столкнется ASP.NET, будет правило, запрещающее всем доступ к папке.
ASP.NET 2.0 добавляет web.config файл в папку, для которой указывается правило доступа. Правила доступа можно изменить с помощью файла конфигурации или с помощью средства администрирования веб-сайта. Другими словами, средство администрирования веб-сайта — это просто интерфейс, с помощью которого файл конфигурации можно редактировать в пользовательской среде.
Использование ролей в коде
API для управления ролями не изменился с версии 1.x. Метод IsInRole используется для определения того, находится ли пользователь в определенной роли.
if (User.IsInRole(Administrators)) {
btnManageSite.Visible = true;
}
ASP.NET также создает экземпляр RolePrincipal в качестве члена текущего контекста. Объект RolePrincipal можно использовать для получения всех ролей, к которым принадлежит пользователь, следующим образом:
string[] userRoles = ((RolePrincipal)User).GetRoles();
Использование RoleGroups с элементом управления LoginView
Теперь, когда у вас есть понимание управления ролями и членства, можно кратко обсудить, как элемент управления LoginView использует эту возможность в ASP.NET 2.0. Как упоминалось ранее, элемент управления LoginView — это шаблонный элемент управления, содержащий два шаблона по умолчанию; AnonymousTemplate и LoggedInTemplate. В диалоговом окне "Задачи LoginView" находится ссылка (показанная ниже), которая позволяет изменять группы ролей.
Рис. 9
Каждый объект RoleGroup содержит массив строк, определяющих, к каким ролям применяется RoleGroup. Чтобы добавить новую группу ролей в элемент управления LoginView, щелкните ссылку "Изменить группы ролей". На приведенном выше изображении видно, что я добавил новую группу ролей для администраторов. Выбрав группу ролей (RoleGroup[0]) в раскрывающемся списке "Представления", можно настроить шаблон, который будет отображаться только членам роли "Администраторы". На приведенном ниже изображении я добавил новую группу ролей, которая применяется к членам роли продаж и роли распространения. При этом в раскрывающемся списке "Представления" в диалоговом окне "Задачи LoginView" добавляется вторая группа ролей, и все, что добавлено к этому шаблону, будет отображаться любым пользователем в роли "Продажи" или "Распределение".
Рис. 10
Переопределение существующего поставщика членства
Существует несколько способов расширения функциональных возможностей ASP.NET членства. Во-первых, можно изменить существующую функциональность класса SqlMembershipProvider, наследуя от него и переопределяя его методы. Например, если вы хотите реализовать собственные функциональные возможности при создании пользователей, можно создать собственный класс, наследующий от SqlMembershipProvider, как показано ниже.
public class jForumMembershipProvider : SqlMembershipProvider {
public jForumMembershipProvider() {
}
public override MembershipUser CreateUser(
string username,
string password,
string email,
string passwordQuestion,
string passwordAnswer,
bool isApproved,
object providerUserKey,
out MembershipCreateStatus status) {
// your own implementation
return base.CreateUser(
username,
password,
email,
passwordQuestion,
passwordAnswer,
isApproved,
providerUserKey,
out status);
}
}
Если же вы хотите создать своего провайдера (например, для хранения информации о членстве в базе данных Access), то вы можете это сделать.
Создание собственного поставщика членства
Чтобы создать собственный поставщик членства, сначала необходимо создать класс, наследующий от класса MembershipProvider. Если вы используете VB.NET, Visual Studio 2005 добавит заглушки для всех методов, которые необходимо переопределить. Если вы используете C#, это ваша задача добавить заглушки.
Вам потребуется переопределить следующее:
- Свойство ApplicationName
- Функция ChangePassword
- Функция ChangePasswordQuestionAndAnswer (Смена вопроса и ответа для пароля)
- Функция CreateUser
- Функция DeleteUser
- Свойство EnablePasswordReset
- Свойство EnablePasswordRetrieval
- Функция FindUsersByEmail
- Функция FindUsersByName
- Функция GetAllUsers
- Функция GetNumberOfUsersOnline
- Функция GetPassword
- Функция GetUser
- Функция GetUserNameByEmail
- Свойство MaxInvalidPasswordAttempts
- Свойство MinRequiredNonAlphanumericCharacters
- Свойство MinRequiredPasswordLength
- Свойство PasswordAttemptWindow
- Свойство PasswordFormat
- Свойство PasswordStrengthRegularExpression
- Свойство RequiresQuestionAndAnswer
- Свойство RequiresUniqueEmail
- Функция ResetPassword
- Разблокировка пользовательской функции
- Функция UpdateUser
- Функция ValidateUser
Это довольно большой список для реализации как разработчик C#. Вы можете упростить создание класса в VB.NET без какой-либо реализации, а затем использовать отражатель .NET или аналогичное средство для преобразования кода в C#.
Строка подключения и другие свойства должны быть заданы по умолчанию в методе Initialize. (Метод Initialize запускается при загрузке поставщика во время выполнения.) Второй параметр метода Initialize имеет тип System.Collections.Specialized.NameValueCollection и является ссылкой на <элемент add> , связанный с пользовательским поставщиком в файле web.config. Эта запись выглядит следующим образом:
<system.web>
<authentication mode="Forms"/>
<membership
defaultProvider="jForumCustomMembershipProvider" >
<providers>
<add name="jForumCustomMembershipProvider"
type="jForumCustomMembershipProvider"
requiresQuestionAndAnswer="true"
connectionString="Provider=Microsoft.Jet.
OLEDB.4.0;Data Source=C:\jForumCustomMembershipProvider\
App_Data\Members.mdb;Persist Security
Info=False"
/>
</providers>
</membership>
</system.web>
Ниже приведен пример метода Initialize.
public override void Initialize(string name,
System.Collections.Specialized.NameValueCollection config) {
if (config["requiresQuestionAndAnswer"])
_requiresQuestionAndAnswer = true;
_connString = config["connectionString"];
base.Initialize(name, config);
}
Чтобы проверить пользователя при отправке формы входа, необходимо использовать метод ValidateUser. Этот метод запускается, когда пользователь нажимает кнопку входа в элементе управления Login. Следует поместить код, который выполняет поиск пользователя, в этот метод.
Как видно, написание собственного поставщика членства несложно и позволяет расширить эту мощную функциональность ASP.NET 2.0.