Создание ролей и управление ими (C#)
Примечание
С момента написания этой статьи поставщики членства ASP.NET были заменены ASP.NET Identity. Мы настоятельно рекомендуем обновить приложения для использования платформы ASP.NET Identity , а не поставщиков членства, которые были представлены на момент написания этой статьи. ASP.NET Identity имеет ряд преимуществ по сравнению с системой членства ASP.NET, включая :
- более высокая производительность;
- Улучшенная расширяемость и тестируемость
- Поддержка OAuth, OpenID Connect и двухфакторной проверки подлинности
- Поддержка удостоверений на основе утверждений
- Улучшенное взаимодействие с ASP.Net Core
Скачать код или скачать PDF-файл
В этом руководстве рассматриваются шаги, необходимые для настройки платформы ролей. После этого мы создадим веб-страницы для создания и удаления ролей.
Введение
В руководстве по авторизации на основе пользователя мы рассмотрели использование авторизации ПО URL-адреса для ограничения доступа определенных пользователей к набору страниц, а также изучили декларативные и программные методы настройки функциональности страницы ASP.NET на основе посещающего пользователя. Однако предоставление разрешений на доступ к страницам или функциональных возможностей для каждого пользователя может стать кошмаром обслуживания в сценариях, где существует много учетных записей пользователей или когда привилегии пользователей часто меняются. Каждый раз, когда пользователь получает или теряет авторизацию для выполнения определенной задачи, администратор должен обновить соответствующие правила авторизации URL-адресов, декларативную разметку и код.
Обычно это помогает классифицировать пользователей по группам или ролям , а затем применять разрешения на основе ролей. Например, большинство веб-приложений имеют определенный набор страниц или задач, зарезервированных только для пользователей с правами администратора. Используя методы, изученные в руководстве по авторизации на основе пользователя , мы добавим соответствующие правила авторизации URL-адресов, декларативную разметку и код, чтобы разрешить указанным учетным записям пользователей выполнять административные задачи. Но если был добавлен новый администратор или если существующий администратор должен был отозвать права администратора, нам придется вернуть и обновить файлы конфигурации и веб-страницы. Однако с помощью ролей можно создать роль с именем Администраторы и назначить этим доверенным пользователям роль Администраторы. Далее мы добавим соответствующие правила авторизации URL-адресов, декларативную разметку и код, чтобы разрешить роли администраторов выполнять различные административные задачи. При использовании этой инфраструктуры добавление новых администраторов на сайт или удаление существующих администраторов выполняется так же просто, как включение или удаление пользователя из роли администраторов. Нет необходимости в настройке, декларативной разметке или изменении кода.
ASP.NET предлагает платформу ролей для определения ролей и их связывания с учетными записями пользователей. С помощью платформы ролей можно создавать и удалять роли, добавлять пользователей в роль или удалять их из нее, определять набор пользователей, принадлежащих определенной роли, и определять, принадлежит ли пользователь к определенной роли. После настройки платформы ролей можно ограничить доступ к страницам на основе ролей с помощью правил авторизации URL-адресов, а также отобразить или скрыть дополнительные сведения или функциональные возможности на странице в зависимости от текущих ролей пользователя, выполнившего вход.
В этом руководстве рассматриваются шаги, необходимые для настройки платформы ролей. После этого мы создадим веб-страницы для создания и удаления ролей. В руководстве Назначение ролей пользователям мы рассмотрим добавление и удаление пользователей из ролей. В руководстве по авторизации на основе ролей мы посмотрим, как ограничить доступ к страницам на основе ролей, а также как настроить функциональность страницы в зависимости от роли посещающего пользователя. Приступим к работе!
Шаг 1. Добавление новых страниц ASP.NET
В этом руководстве и в следующих двух мы рассмотрим различные функции и возможности, связанные с ролями. Нам потребуется ряд ASP.NET страниц для реализации тем, рассмотренных в этих руководствах. Давайте создадим эти страницы и обновим карту сайта.
Для начала создайте в проекте папку с именем Roles
. Затем добавьте в папку Roles
четыре новые страницы ASP.NET, связав каждую страницу со страницей Site.master
master. Назовите страницы:
ManageRoles.aspx
UsersAndRoles.aspx
CreateUserWizardWithRoles.aspx
RoleBasedAuthorization.aspx
На этом этапе Обозреватель решения проекта должен выглядеть примерно так, как на снимке экрана, показанном на рисунке 1.
Рис. 1. В папку Roles
добавлены четыре новые страницы (щелкните для просмотра полноразмерного изображения)
На этом этапе каждая страница должна иметь два элемента управления Содержимое, по одному для каждого из master страницы ContentPlaceHolders: MainContent
и LoginContent
.
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent"Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="LoginContent"Runat="Server">
</asp:Content>
Помните, что LoginContent
в разметке ContentPlaceHolder по умолчанию отображается ссылка для входа на сайт или выхода из нее в зависимости от того, прошел ли пользователь проверку подлинности. Однако наличие элемента управления Содержимое Content2
на странице ASP.NET переопределяет разметку страницы master по умолчанию. Как мы обсуждали в руководстве Обзор проверки подлинности с помощью форм, переопределение разметки по умолчанию полезно на страницах, где в левом столбце не требуется отображать параметры, связанные с входом.
Однако для этих четырех страниц мы хотим показать разметку master страницы по умолчанию для LoginContent
ContentPlaceHolder. Поэтому удалите декларативную разметку для элемента управления Содержимое Content2
. После этого каждая из четырех страниц должна содержать только один элемент управления Содержимое.
Наконец, давайте обновим карту сайта (Web.sitemap
), чтобы включить эти новые веб-страницы. Добавьте следующий XML-код после <siteMapNode>
, добавленного для руководств по членству.
<siteMapNode title="Roles">
<siteMapNode url="~/Roles/ManageRoles.aspx" title="Manage Roles"/>
<siteMapNode url="~/Roles/UsersAndRoles.aspx" title="Users and Roles" />
<siteMapNode url="~/Roles/CreateUserWizardWithRoles.aspx" title="Create Account (with Roles)" />
<siteMapNode url="~/Roles/RoleBasedAuthorization.aspx" title="Role-Based Authorization" />
</siteMapNode>
После обновления карты сайта посетите сайт через браузер. Как показано на рисунке 2, навигация слева теперь содержит элементы учебников по ролям.
Рис. 2. В папку Roles
добавлены четыре новые страницы (щелкните для просмотра полноразмерного изображения)
Шаг 2. Указание и настройка поставщика платформы ролей
Как и платформа членства, платформа ролей построена на основе модели поставщика. Как описано в руководстве по основам безопасности и поддержке ASP.NET, платформа .NET Framework поставляется с тремя встроенными поставщиками ролей: AuthorizationStoreRoleProvider
, WindowsTokenRoleProvider
и SqlRoleProvider
. В этой серии учебников основное SqlRoleProvider
внимание уделяется , в котором в качестве хранилища ролей используется база данных SQL Server Майкрософт.
Под ним охватывается платформа ролей и SqlRoleProvider
работает так же, как платформа членства и SqlMembershipProvider
. Платформа .NET Framework содержит Roles
класс, который служит в качестве API для платформы ролей. Класс имеет статические Roles
методы, такие как CreateRole
, DeleteRole
, GetAllRoles
, AddUserToRole
, IsUserInRole
и т. д. При вызове Roles
одного из этих методов класс делегирует вызов настроенного поставщика. в SqlRoleProvider
ответе работает с таблицами для конкретных ролей (aspnet_Roles
и aspnet_UsersInRoles
).
Чтобы использовать SqlRoleProvider
поставщик в нашем приложении, необходимо указать базу данных, используемую в качестве хранилища. Ожидает SqlRoleProvider
, что указанное хранилище ролей будет содержать определенные таблицы базы данных, представления и хранимые процедуры. Эти необходимые объекты базы данных можно добавить с помощью aspnet_regsql.exe
средства . На этом этапе у нас уже есть база данных со схемой, необходимой SqlRoleProvider
для . В учебнике Создание схемы членства в SQL Server мы создали базу данных с именем SecurityTutorials.mdf
и использовали ее для aspnet_regsql.exe
добавления служб приложений, которые включали объекты базы данных, необходимые SqlRoleProvider
для . Поэтому нам просто нужно указать платформе ролей включить поддержку ролей и использовать SqlRoleProvider
с базой SecurityTutorials.mdf
данных в качестве хранилища ролей.
Платформа ролей настраивается с помощью <roleManager
> элемента в файле приложения.Web.config
По умолчанию поддержка ролей отключена. Чтобы включить его, необходимо задать <roleManager
> для атрибута enabled
true
элемента следующий вид:
<?xml version="1.0"?>
<configuration>
<system.web>
... Additional configuration markup removed for brevity ...
<roleManager enabled="true" />
<system.web>
</configuration>
По умолчанию все веб-приложения имеют поставщик ролей с именем AspNetSqlRoleProvider
типа SqlRoleProvider
. Этот поставщик по умолчанию зарегистрирован в machine.config
(расположен по адресу %WINDIR%\Microsoft.Net\Framework\v2.0.50727\CONFIG
):
<roleManager>
<providers>
<add name="AspNetSqlRoleProvider"
connectionStringName="LocalSqlServer"
applicationName="/"
type="System.Web.Security.SqlRoleProvider,
System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</providers>
</roleManager>
Атрибут поставщика connectionStringName
указывает используемое хранилище ролей. Поставщик AspNetSqlRoleProvider
задает этому атрибуту LocalSqlServer
значение , которое также определено в machine.config
и указывает по умолчанию на SQL Server 2005, экспресс-выпуск базу данных в папке App_Data
с именем aspnet.mdf
.
Следовательно, если мы просто включим платформу ролей без указания сведений о поставщике в файле приложенияWeb.config
, приложение будет использовать зарегистрированный по умолчанию поставщик ролей . AspNetSqlRoleProvider
~/App_Data/aspnet.mdf
Если база данных не существует, среда выполнения ASP.NET автоматически создаст ее и добавит схему служб приложений. Однако мы не хотим использовать aspnet.mdf
базу данных, а базу данных, SecurityTutorials.mdf
в которую мы уже создали и в которую добавили схему служб приложений. Это изменение можно выполнить одним из двух способов:
- Укажите значение для
LocalSqlServer
имя строки подключения вWeb.config
. ПерезаписавLocalSqlServer
значение имени строки подключения вWeb.config
, мы можем использовать зарегистрированный по умолчанию поставщик ролей (AspNetSqlRoleProvider
) и правильно работать с базойSecurityTutorials.mdf
данных. Дополнительные сведения об этом методе см. в записи блога Скотта ГатриНастройка служб приложений ASP.NET 2.0 для использования SQL Server 2000 или SQL Server 2005. - Добавление нового зарегистрированного поставщика типа
SqlRoleProvider
и настройте егоconnectionStringName
параметр , указывающийSecurityTutorials.mdf
наБазы данных. Это подход, который я рекомендовал и использовал в руководстве Создание схемы членства в SQL Server, и он будет использоваться и в этом руководстве.
Добавьте в файл следующую разметку конфигурации Web.config
Roles. Эта разметка регистрирует новый поставщик с именем SecurityTutorialsSqlRoleProvider
.
<?xml version="1.0"?>
<configuration>
<connectionStrings>
<add name="SecurityTutorialsConnectionString"
connectionString="..."/>
</connectionStrings>
<system.web>
... Additional configuration markup removed for brevity ...
<roleManager enabled="true" defaultProvider="SecurityTutorialsSqlRoleProvider">
<providers>
<add name="SecurityTutorialsSqlRoleProvider"
type="System.Web.Security.SqlRoleProvider"
applicationName="SecurityTutorials"
connectionStringName="SecurityTutorialsConnectionString" />
</providers>
</roleManager>
<system.web>
</configuration>
Приведенная выше разметка определяет в SecurityTutorialsSqlRoleProvider
качестве поставщика по умолчанию (через defaultProvider
атрибут в элементе <roleManager>
). Он также задает SecurityTutorialsSqlRoleProvider
applicationName
для параметра значение SecurityTutorials
, которое является тем же applicationName
параметром, который используется поставщиком членства (SecurityTutorialsSqlMembershipProvider
). Хотя элемент для SqlRoleProvider
не показан здесь, <add>
может также содержать commandTimeout
атрибут для указания времени ожидания базы данных в секундах. Значение по умолчанию — 30.
С помощью этой разметки конфигурации мы готовы приступить к использованию функциональных возможностей ролей в приложении.
Примечание
В приведенной выше разметке <roleManager
> конфигурации показано использование атрибутов enabled
и defaultProvider
элемента . Существует ряд других атрибутов, влияющих на то, как платформа ролей связывает сведения о ролях для каждого пользователя. Мы рассмотрим эти параметры в руководстве по авторизации на основе ролей .
Шаг 3. Изучение API ролей
Функциональность платформы ролей предоставляется через Roles
класс , который содержит тринадцать статических методов для выполнения операций на основе ролей. При создании и удалении ролей в шагах 4 и 6 мы будем использовать CreateRole
методы и DeleteRole
, которые добавляют или удаляют роль из системы.
Чтобы получить список всех ролей в системе, используйте GetAllRoles
метод (см. шаг 5). МетодRoleExists
возвращает логическое значение, указывающее, существует ли указанная роль.
В следующем руководстве мы рассмотрим, как связать пользователей с ролями. Методы Roles
класса AddUserToRole
, AddUserToRoles
, AddUsersToRole
и AddUsersToRoles
добавляют одного или нескольких пользователей к одной или нескольким ролям. Чтобы удалить пользователей из ролей, используйте методы RemoveUserFromRole
, RemoveUserFromRoles
, RemoveUsersFromRole
или RemoveUsersFromRoles
.
В руководстве по авторизации на основе ролей мы рассмотрим способы программного отображения или скрытия функциональных возможностей на основе текущей роли пользователя, выполнившего вход. Для этого можно использовать Role
методы класса FindUsersInRole
, GetRolesForUser
, GetUsersInRole
, или IsUserInRole
.
Примечание
Помните, что при вызове одного из этих методов Roles
класс делегирует вызов настроенного поставщика. В нашем случае это означает, что вызов отправляется в SqlRoleProvider
. SqlRoleProvider
Затем выполняет соответствующую операцию базы данных на основе вызываемого метода . Например, код Roles.CreateRole("Administrators")
приводит к выполнению SqlRoleProvider
хранимой aspnet_Roles_CreateRole
процедуры, которая вставляет новую запись в таблицу aspnet_Roles
с именем Administrators .
В оставшейся части этого руководства рассматривается использование Roles
методов класса CreateRole
, GetAllRoles
и DeleteRole
для управления ролями в системе.
Шаг 4. Создание новых ролей
Роли предлагают способ произвольной группировки пользователей, и чаще всего это группирование используется для более удобного способа применения правил авторизации. Но чтобы использовать роли в качестве механизма авторизации, сначала необходимо определить, какие роли существуют в приложении. К сожалению, ASP.NET не включает элемент управления CreateRoleWizard. Чтобы добавить новые роли, необходимо создать подходящий пользовательский интерфейс и вызвать API ролей самостоятельно. Хорошей новостью является то, что это очень легко сделать.
Примечание
Хотя веб-элемент управления CreateRoleWizard отсутствует, существует средство администрирования веб-сайта ASP.NET, которое представляет собой локальное приложение ASP.NET, предназначенное для просмотра конфигурации веб-приложения и управления им. Тем не менее, я не большой поклонник ASP.NET web Site Administration Tool по двум причинам. Во-первых, это немного buggy и взаимодействие с пользователем оставляет желать лучшего. Во-вторых, средство администрирования веб-сайта ASP.NET предназначено для работы только локально. Это означает, что вам придется создавать собственные веб-страницы управления ролями, если необходимо удаленно управлять ролями на активном сайте. По этим двум причинам в этом и следующем руководстве основное внимание уделяется созданию необходимых средств управления ролями на веб-странице, а не на использовании средства администрирования веб-сайта ASP.NET.
Откройте страницу ManageRoles.aspx
в папке Roles
и добавьте на нее элемент управления TextBox и Button Web. Присвойте свойству элемента управления ID
TextBox значение RoleName
, а свойствам CreateRoleButton
Button ID
и Text
— значения и Создать роль соответственно. На этом этапе декларативная разметка страницы должна выглядеть примерно так:
<b>Create a New Role: </b>
<asp:TextBox ID="RoleName" runat="server"></asp:TextBox>
<br />
<asp:Button ID="CreateRoleButton" runat="server" Text="Create Role" />
Затем дважды щелкните CreateRoleButton
элемент управления Button в Designer, чтобы создать Click
обработчик событий, а затем добавьте следующий код:
protected void CreateRoleButton_Click(object sender, EventArgs e)
{
string newRoleName = RoleName.Text.Trim();
if (!Roles.RoleExists(newRoleName))
// Create the role
Roles.CreateRole(newRoleName);
RoleName.Text = string.Empty;
}
Приведенный выше код начинается с назначения имени обрезаемой роли, введенной в RoleName
TextBox переменной newRoleName
. Затем вызывается метод класса RoleExists
, чтобы определить, Roles
существует ли роль newRoleName
в системе. Если роль не существует, она создается с помощью вызова CreateRole
метода . CreateRole
Если методу передается имя роли, которое уже существует в системе, ProviderException
возникает исключение. Вот почему код сначала проверяет, что роль еще не существует в системе, прежде чем вызывать CreateRole
. Обработчик Click
событий завершается очисткой RoleName
свойства TextBox Text
.
Примечание
Возможно, вас интересует, что произойдет, если пользователь не введет какое-либо значение в RoleName
TextBox. Если значение, переданное в CreateRole
метод , является null
или пустой строкой, возникает исключение. Аналогичным образом, если имя роли содержит запятую, возникает исключение. Следовательно, страница должна содержать элементы управления проверкой, чтобы убедиться, что пользователь входит в роль и что она не содержит запятых. Я оставляю как упражнение для читателя.
Давайте создадим роль с именем Администраторы. Перейдите на страницу ManageRoles.aspx
в браузере, введите "Администраторы" в текстовое поле (см. рис. 3) и нажмите кнопку Создать роль.
Рис. 3. Создание роли администраторов (щелкните, чтобы просмотреть полноразмерное изображение)
Что происходит? Происходит обратная связь, но нет визуального подсказки о том, что роль действительно добавлена в систему. Мы обновим эту страницу на шаге 5, чтобы включить визуальную обратную связь. Однако сейчас можно проверить, создана ли роль, перейдя в SecurityTutorials.mdf
базу данных и отображая данные из aspnet_Roles
таблицы. Как показано на рисунке 4, таблица aspnet_Roles
содержит запись для только что добавленных ролей администраторов.
Рис. 4. Таблица aspnet_Roles
содержит строку для администраторов (щелкните, чтобы просмотреть полноразмерное изображение)
Шаг 5. Отображение ролей в системе
Давайте добавим страницу ManageRoles.aspx
, включив список текущих ролей в системе. Для этого добавьте элемент управления GridView на страницу и задайте для его ID
свойства значение RoleList
. Затем добавьте метод в класс кода программной части страницы с именем DisplayRolesInGrid
, используя следующий код:
private void DisplayRolesInGrid()
{
RoleList.DataSource = Roles.GetAllRoles();
RoleList.DataBind();
}
Метод Roles
класса GetAllRoles
возвращает все роли в системе в виде массива строк. Затем этот массив строк привязывается к GridView. Чтобы привязать список ролей к GridView при первой загрузке страницы, необходимо вызвать DisplayRolesInGrid
метод из обработчика Page_Load
событий страницы. Следующий код вызывает этот метод при первом посещении страницы, но не при последующих обратных операциях.
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
DisplayRolesInGrid();
}
После этого кода перейдите на страницу через браузер. Как показано на рисунке 5, вы увидите сетку с одним столбцом с меткой Item. Сетка содержит строку для роли Администраторы, добавленной на шаге 4.
Рис. 5. GridView отображает роли в одном столбце (щелкните для просмотра полноразмерного изображения)
GridView отображает отдельный столбец с меткой Item, так как свойство GridView AutoGenerateColumns
имеет значение True (по умолчанию), что приводит к автоматическому созданию столбца для каждого свойства в элементе DataSource
GridView. Массив имеет одно свойство, представляющее элементы массива, то есть один столбец в GridView.
При отображении данных с помощью GridView я предпочитаю явно определять столбцы, а не создавать их неявно с помощью GridView. Явно определяя столбцы, гораздо проще форматировать данные, переупорядочить столбцы и выполнять другие общие задачи. Поэтому давайте обновим декларативную разметку GridView, чтобы ее столбцы были явно определены.
Для начала присвойте AutoGenerateColumns
свойству GridView значение False. Затем добавьте templateField в сетку, задайте для его HeaderText
свойства значение Roles и настройте его ItemTemplate
таким образом, чтобы отображалось содержимое массива. Для этого добавьте веб-элемент управления Label с именем RoleNameLabel
в и привяжите ItemTemplate
его Text
свойство к Container.DataItem
.
Эти свойства и содержимое ItemTemplate
можно задать декларативно или с помощью диалогового окна Поля GridView и интерфейса Редактирование шаблонов. Чтобы открыть диалоговое окно Поля, щелкните ссылку Изменить столбцы в смарт-теге GridView. Затем снимите флажок Автоматически создавать поля, чтобы задать AutoGenerateColumns
для свойства значение False, и добавьте TemplateField в GridView, задав для его HeaderText
свойства значение Role. Чтобы определить содержимое ItemTemplate
, выберите параметр Изменить шаблоны из смарт-тега GridView. Перетащите элемент управления Label Web в , ItemTemplate
задайте для его ID
свойства RoleNameLabel
значение и настройте его параметры привязки данных так, чтобы его Text
свойство было привязано к Container.DataItem
.
Независимо от того, какой подход вы используете, итоговая декларативная разметка GridView должна выглядеть примерно так, как по завершении.
<asp:GridView ID="RoleList" runat="server" AutoGenerateColumns="false">
<Columns>
<asp:TemplateField HeaderText="Role">
<ItemTemplate>
<asp:Label runat="server" ID="RoleNameLabel" Text='<%# Container.DataItem %>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Примечание
Содержимое массива отображается с помощью синтаксиса <%# Container.DataItem %>
привязки данных . Подробное описание того, почему этот синтаксис используется при отображении содержимого массива, привязанного к GridView, выходит за рамки область этого руководства. Дополнительные сведения по этому вопросу см. в статье Привязка скалярного массива к веб-элементу управления данных.
В настоящее RoleList
время GridView привязан к списку ролей только при первом посещении страницы. Необходимо обновлять сетку при каждом добавлении новой роли. Для этого обновите CreateRoleButton
обработчик событий Button Click
, чтобы он вызвал DisplayRolesInGrid
метод при создании новой роли.
protected void CreateRoleButton_Click(object sender, EventArgs e)
{
string newRoleName = RoleName.Text.Trim();
if (!Roles.RoleExists(newRoleName))
{
// Create the role
Roles.CreateRole(newRoleName);
// Refresh the RoleList Grid
DisplayRolesInGrid();
}
RoleName.Text = string.Empty;
}
Теперь, когда пользователь добавляет новую роль, RoleList
GridView отображает только что добавленную роль при обратной отправке, предоставляя визуальную обратную связь о том, что роль была успешно создана. Чтобы проиллюстрировать это, посетите страницу ManageRoles.aspx
в браузере и добавьте роль с именем Супервизоры. После нажатия кнопки Создать роль будет выполняться обратная связь, и сетка обновится, включив в нее администраторов, а также новую роль "Супервизоры".
Рис. 6. Добавлена роль "Супервизоры" (щелкните для просмотра полноразмерного изображения)
Шаг 6. Удаление ролей
На этом этапе пользователь может создать новую роль и просмотреть все существующие роли на ManageRoles.aspx
странице. Давайте разрешим пользователям также удалять роли. Метод Roles.DeleteRole
имеет две перегрузки:
DeleteRole(roleName)
— удаляет roleName. Исключение возникает, если роль содержит один или несколько членов.DeleteRole(roleName, throwOnPopulatedRole)
— удаляет roleName. Если throwOnPopulateRole имеет значениеtrue
, то создается исключение, если роль содержит один или несколько членов. Если throwOnPopulateRole имеет значениеfalse
, роль удаляется независимо от того, содержит ли она какие-либо члены. На внутреннем сервереDeleteRole(roleName)
метод вызываетDeleteRole(roleName, true)
.
Метод DeleteRole
также создает исключение, если roleName является null
или пустой строкой или если roleName содержит запятую. Если roleName не существует в системе, DeleteRole
происходит сбой без исключения.
Давайте добавим GridView в ManageRoles.aspx
, чтобы добавить кнопку Удалить, которая при нажатии удаляет выбранную роль. Начните с добавления кнопки Удалить в GridView, перейдя в диалоговое окно Поля и добавив кнопку Удалить, которая находится в параметре CommandField. Сделайте кнопку Удалить в крайнем левом столбце и задайте для его DeleteText
свойства значение Удалить роль .
Рис. 7. Добавление кнопки удаления в RoleList
GridView (щелкните для просмотра полноразмерного изображения)
После добавления кнопки Удалить декларативная разметка GridView должна выглядеть примерно так:
<asp:GridView ID="RoleList" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:CommandField DeleteText="Delete Role" ShowDeleteButton="True"/>
<asp:TemplateField HeaderText="Role">
<ItemTemplate>
<asp:Label runat="server" ID="RoleNameLabel" Text='<%# Container.DataItem %>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
Затем создайте обработчик событий для события GridView RowDeleting
. Это событие возникает при обратной отправке при нажатии кнопки Удалить роль. Добавьте в обработчик событий приведенный ниже код.
protected void RoleList_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
// Get the RoleNameLabel
Label RoleNameLabel = RoleList.Rows[e.RowIndex].FindControl("RoleNameLabel") as Label;
// Delete the role
Roles.DeleteRole(RoleNameLabel.Text, false);
// Rebind the data to the RoleList grid
DisplayRolesInGrid();
}
Код начинается с программной ссылки на RoleNameLabel
веб-элемент управления в строке, для которой была нажата кнопка "Удалить роль". Затем Roles.DeleteRole
вызывается метод , передавая Text
RoleNameLabel
false
в и , тем самым удаляя роль независимо от того, связаны ли с этой ролью пользователи. Наконец, RoleList
GridView обновляется, чтобы только что удаленная роль больше не отображалась в сетке.
Примечание
Кнопка Удалить роль не требует подтверждения от пользователя перед удалением роли. Одним из самых простых способов подтверждения действия является диалоговое окно подтверждения на стороне клиента. Дополнительные сведения об этом методе см. в статье Добавление подтверждения Client-Side при удалении.
Сводка
Многие веб-приложения имеют определенные правила авторизации или функции на уровне страницы, доступные только определенным классам пользователей. Например, может существовать набор веб-страниц, доступ к которым имеют только администраторы. Вместо того, чтобы определять эти правила авторизации для каждого пользователя, часто бывает удобнее определять правила на основе роли. То есть вместо того, чтобы явно разрешать пользователям Скотту и Jisun доступ к административным веб-страницам, более приемлемым подходом является предоставление членам роли "Администраторы" доступа к этим страницам, а затем указание Скотта и Jisun как пользователей, принадлежащих к роли "Администраторы".
Платформа ролей упрощает создание ролей и управление ими. В этом руководстве мы рассмотрели, как настроить платформу ролей для использования SqlRoleProvider
, которая использует базу данных Microsoft SQL Server в качестве хранилища ролей. Мы также создали веб-страницу, на которой перечислены существующие роли в системе и можно создавать новые роли и удалять существующие роли. В последующих руководствах мы рассмотрим, как назначать пользователей ролям и применять авторизацию на основе ролей.
Счастливого программирования!
Дополнительные материалы
Дополнительные сведения о темах, рассмотренных в этом руководстве, см. в следующих ресурсах:
- Изучение членства, ролей и профиля ASP.NET 2.0
- Практическое руководство. Использование диспетчера ролей в ASP.NET 2.0
- Поставщики ролей
- Техническая документация по элементу
<roleManager>
- Использование API членства и диспетчера ролей
Об авторе
Скотт Митчелл(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