Реализация поставщика ролей
Обновлен: Ноябрь 2007
Управление ролями ASP.NET позволяет легко пользоваться различными поставщиками ролей для приложений ASP.NET. Можно использовать предоставленные поставщики профилей, входящие в платформу .NET Framework, или собственные поставщики.
Существуют две главные причины для создания пользовательского поставщика ролей.
Необходимо хранить данные роли в источнике данных, который не поддерживается поставщиками ролей, входящими в платформу .NET Framework, например, базы данных FoxPro и Oracle или другие источники данных.
Необходимо управлять данными ролей с помощью схемы базы данных, отличной от той, которую применяют поставщики из комплекта платформы .NET Framework. В качестве типичного примера такого случая можно привести данные авторизации, которые уже существуют в базе данных SQL Server для компании или веб-узла.
Необходимые классы
Для реализации поставщика ролей необходимо создать класс, который будет наследовать абстрактный класс RoleProvider из пространства имен System.Web.Security. Абстрактный класс RoleProvider наследует абстрактный класс ProviderBase из пространства имен System.Configuration.Provider. Таким образом, необходимо также реализовать обязательные члены класса ProviderBase. В таблицах ниже указаны необходимые свойства и методы, которые должны быть реализованы из абстрактных классов ProviderBase и RoleProvider, и приведены их описания. С реализацией каждого члена можно ознакомиться, просмотрев пример кода в разделе Пример реализации поставщика ролей.
Члены поставщика ProviderBase
Член |
Описание |
---|---|
Метод Initialize |
Принимает в качестве входных данных имя поставщика и коллекцию NameValueCollection параметров конфигурации. Используется для присвоения значений свойствам экземпляра поставщика, включая значения, зависимые от реализации, и параметры в файле конфигурации (Machine.config или Web.config). |
Члены поставщика RoleProvider
Член |
Описание |
---|---|
Свойство ApplicationName |
Имя приложения на основе данных о роли, указанных в файле конфигурации (Web.config). Свойство ApplicationName хранится в источнике данных вместе со сведениями о пользователе и применяется при создании запросов на сведения о пользователе. Дополнительные сведения о свойстве ApplicationName см. в этом разделе ниже. Это свойство доступно для чтения и записи. Значение по умолчанию для свойства ApplicationPath явно не указано. |
Метод AddUsersToRoles |
Принимает список имен пользователей и список имен ролей; связывает указанных пользователей с указанными ролями в источнике данных для настроенного свойства ApplicationName. Если какое-то имя роли или имя пользователя отсутствует в настроенном свойстве ApplicationName, необходимо создать исключение ProviderException. Если любое из указанных имен пользователей или имен ролей представляет собой пустую строку, необходимо вывести исключение ArgumentException, а если любое из этих имен ролей равно null (Nothing в Visual Basic), — то исключение ArgumentNullException. Если источник данных поддерживает транзакции, рекомендуется включить каждую операцию добавления в транзакцию и откатывать транзакцию и создавать исключения при каждом сбое в операции добавления. |
Метод CreateRole |
Принимает имя роли и добавляет указанную роль в источник данных для настроенного свойства ApplicationName. Если указанное имя роли уже существует для настраиваемого свойства ApplicationName, необходимо сгенерировать исключение ProviderException. Если указанное имя роли является пустой строкой, содержит запятую, или превышает допустимую в источнике данных длину, необходимо создать исключение ArgumentException, а если указанное имя роли равно значению null (в Visual Basic — значению Nothing), необходимо создать исключение ArgumentNullException. |
Метод DeleteRole |
Принимает в качестве входных параметров имя роли и логическое значение, которое указывает на вывод исключения, если с ролью связаны другие пользователи. Метод DeleteRole удаляет указанную роль из источника данных для настроенного свойства ApplicationName. Если параметр throwOnPopulatedRole равен true, а роль, определяемая параметром имени роли, имеет один или более членов, следует вывести исключение ProviderException и не удалять роль. Если параметр throwOnPopulatedRole равен false, тогда удалите роль, независимо от того, является ли она пустой или нет. При удалении роли из источника данных убедитесь, что удаляются и все связи между именем пользователя и удаленной ролью для настроенного свойства ApplicationName. Необходимо вывести исключение ArgumentException, если указанное имя роли не существует или является пустой строкой. Необходимо вывести исключение ArgumentNullException, если указанное имя роли равно null (Nothing в Visual Basic). |
Метод FindUsersInRole |
Принимает в качестве входных параметров имя роли и искомое имя пользователя. Возвращает список пользователей в роли, в которой имя пользователя содержит совпадение с указанным значением usernameToMatch для настроенного свойства ApplicationName. Поддерживаются подстановочные знаки на основе источника данных. Имена пользователей возвращаются в алфавитном порядке. Рекомендуется вывести исключение ProviderException, если указанное имя роли не существует в источнике данных. |
Метод GetAllRoles |
Возвращает список имен ролей из источника данных. Извлекаются только роли для указанного свойства ApplicationName. Если отсутствуют роли для настроенного свойства ApplicationName, рекомендуется возвращать массив строк, не содержащий элементов. |
Метод GetRolesForUser |
Принимает в качестве входных параметров имя пользователя и возвращает из источника данных имена ролей, связанных с указанным пользователем. Извлекаются только роли для указанного свойства ApplicationName. Если не существует ролей, связанных с указанным пользователем для настроенного свойства ApplicationName, рекомендуется возвращать массив строк, не содержащий элементов. Рекомендуется выводить исключение ArgumentException, если указанное имя роли является пустой строкой. Рекомендуется выводить исключение ArgumentNullException, если указанное имя пользователя равно null (Nothing в Visual Basic). |
Метод GetUsersInRole |
Принимает в качестве входных параметров имя роли и возвращает из источника данных имена пользователей, связанных с указанной ролью. Извлекаются только роли для указанного свойства ApplicationName. Если указанное имя роли не существует в настраиваемом приложении ApplicationName, необходимо вывести исключение ProviderException. Если не существует пользователей, связанных с указанной ролью для настроенного свойства ApplicationName, рекомендуется возвращать массив строк, не содержащий элементов. Необходимо вывести исключение ArgumentException, если указанное имя роли является пустой строкой, содержит запятую или превышает максимально допустимую длину для имени роли в источнике данных. Необходимо вывести исключение ArgumentNullException, если указанное имя роли равно null (Nothing в Visual Basic). |
Метод IsUserInRole |
Принимает в качестве входных параметров имя пользователя и имя роли. Определяет, связан ли текущий пользователь с ролью из источника данных для настроенного свойства ApplicationName. Необходимо вывести исключение ProviderException, если имя роли или имя пользователя не существует в настроенном свойстве ApplicationName. Необходимо вывести исключение ArgumentException, если указанное имя пользователя или имя роли является пустой строкой, и исключение ArgumentNullException, если указанное имя пользователя или имя роли равно null (Nothing в Visual Basic). |
Метод RemoveUsersFromRoles |
Принимает в качестве входных параметров список имен пользователей и список имен ролей. Удаляет связи указанных пользователей с указанными ролями в источнике данных для настроенного свойства ApplicationName. Необходимо вывести исключение ProviderException, если имена ролей или имена пользователей не существуют для настроенного свойства ApplicationName. Необходимо вывести исключение ArgumentException, если любое из указанных имен пользователя или имен ролей представляет собой пустую строку, и исключение ArgumentNullException, если любое из указанных имен пользователей или имен ролей равно null (Nothing в Visual Basic). Если источник данных поддерживает транзакции, рекомендуется включить каждую операцию удаления в транзакцию и откатывать транзакцию и возбуждать исключение, если какая-либо операция удаления заканчивается неудачно. |
Метод RoleExists |
Принимает в качестве входных параметров имя роли и определяет, существует ли имя роли в источнике данных для настроенного свойства ApplicationName. Необходимо вывести исключение ArgumentException, если указанное имя роли не существует или является пустой строкой. Рекомендуется вывести исключение ArgumentNullException, если указанное имя роли равно null (Nothing в Visual Basic). |
Свойство ApplicationName
Поставщики ролей сохраняют данные о ролях отдельно по каждому приложению. Это позволяет нескольким приложениям ASP.NET бесконфликтно использовать один и тот же источник данных при наличии повторяющихся имен пользователей. В качестве альтернативы несколько приложений ASP.NET могут использовать один источник данных ролей, указывая одно и то же свойство ApplicationName.
Поскольку поставщики ролей хранят данные о ролях отдельно по каждому приложению, необходимо обеспечить наличие имени приложения в схеме данных, а также в запросах и обновлениях. Например, приведенная ниже команда извлекает имя роли из базы данных и гарантирует, что свойство ApplicationName включено в запрос.
SELECT Rolename FROM Roles
WHERE Rolename = 'Administrators' AND ApplicationName = 'MyApplication'
Потокобезопасность
Для каждого поставщика ролей, указанного в конфигурации приложения, в среде ASP.NET создается один экземпляр поставщика ролей, который используется для всех запросов, обслуживаемых объектом HttpApplication. Таким образом, несколько запросов могут выполняться одновременно. В среде ASP.NET не гарантируется потокобезопасность вызовов поставщика. Для обеспечения потокобезопасности необходимо записывать код поставщика. Например, подключиться к базе данных или открыть файл для редактирования следует в члене, который вызывается, например AddUsersToRoles, а не путем открытия файла или подключения к базе данных при вызове метода Initialize.
См. также
Основные понятия
Пример реализации поставщика ролей
Обеспечение безопасности ролей