Создание ролей и управление ими (C#)

Скотт Митчелл

Замечание

С тех пор как эта статья была написана, поставщики членства ASP.NET были заменены ASP.NET Identity. Настоятельно рекомендуется обновлять приложения для использования платформы ASP.NET Identity, а не поставщиков членства ASP.NET, которые были представлены на момент написания этой статьи. 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. Затем добавьте четыре новых ASP.NET страницы в Roles папку, связав каждую страницу с главной страницей Site.master . Назовите страницы:

  • ManageRoles.aspx
  • UsersAndRoles.aspx
  • CreateUserWizardWithRoles.aspx
  • RoleBasedAuthorization.aspx

На этом этапе обозреватель решений проекта должен выглядеть примерно так, как на снимке экрана, показанном на рис. 1.

Четыре новых страницы добавлены в папку ролей

Рис. 1. В папку были добавлены Roles четыре новых страницы (щелкните, чтобы просмотреть изображение полного размера)

Каждая страница, на данном этапе, должна иметь два элемента управления содержимым, по одному для каждого заполнителя содержимого основной страницы: 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 переопределяет разметку главной страницы по умолчанию. Как описано в руководстве по обзору проверки подлинности форм, переопределение разметки по умолчанию полезно на страницах, где не нужно отображать параметры входа в левом столбце.

Однако для этих четырех страниц мы хотим показать разметку эталонной страницы по умолчанию для 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и WindowsTokenRoleProviderSqlRoleProvider. В этой серии учебников основное внимание уделяется SqlRoleProvider, который использует базу данных Microsoft SQL Server для хранения ролей.

Под капотом фреймворк ролей и SqlRoleProvider работает так же, как и фреймворк членства и SqlMembershipProvider. Платформа .NET Framework содержит Roles класс, который служит API для платформы ролей. Класс Roles имеет статические методы, такие как CreateRole, DeleteRole, GetAllRoles, AddUserToRoleIsUserInRoleи т. д. При вызове одного из этих методов класс 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 Express Edition в папке App_Data с именем aspnet.mdf.

Следовательно, если мы просто включите платформу ролей без указания сведений о поставщике в файле нашего приложенияWeb.config, приложение использует зарегистрированного поставщика ролей по умолчанию. AspNetSqlRoleProvider ~/App_Data/aspnet.mdf Если база данных не существует, среда выполнения ASP.NET автоматически создаст ее и добавит схему служб приложений. Однако мы не хотим использовать базу данных aspnet.mdf; вместо этого мы хотим использовать базу данных SecurityTutorials.mdf, которую уже создали и в которую добавили схему служб приложений. Это изменение можно выполнить одним из двух способов:

  • Укажите значение дляLocalSqlServerимени строки подключения вWeb.config. Перезаписав значение имени строки подключения в Web.config, мы можем использовать зарегистрированный поставщик ролей по умолчанию (AspNetSqlRoleProvider) и правильно работать с базой данных SecurityTutorials.mdf. Дополнительные сведения об этом методе см. в записи блога Скотта Гутрии о настройке служб приложений ASP.NET 2.0 для использования SQL Server 2000 или SQL Server 2005.
  • Добавьте нового зарегистрированного поставщика типаSqlRoleProviderи настройте егоconnectionStringNameпараметры, чтобы указать наSecurityTutorials.mdfбазу данных. Это подход, который я рекомендовал и использовал в руководстве по созданию схемы членства в SQL Server, и это подход, который я буду использовать в этом руководстве.

Добавьте следующую разметку конфигурации ролей в файл Web.config. Эта разметка регистрирует новый поставщик с именем 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>). Он также устанавливает настройку SecurityTutorialsSqlRoleProviderapplicationName в SecurityTutorials, которая является той же настройкой applicationName, что используется поставщиком членства (SecurityTutorialsSqlMembershipProvider). Хотя здесь не отображается, <add> элемент для SqlRoleProvider также может содержать commandTimeout атрибут для указания времени ожидания базы данных в секундах. Значение по умолчанию — 30.

С помощью этой разметки конфигурации мы готовы приступить к использованию функциональных возможностей ролей в нашем приложении.

Замечание

Приведенная выше разметка конфигурации иллюстрирует использование атрибутов enabled и defaultProvider элемента <roleManager>. Существует ряд других атрибутов, влияющих на то, как фреймворк ролей связывает информацию о роли в зависимости от пользователя. Мы рассмотрим эти параметры в руководстве по ролевой авторизации.

Шаг 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") вызывает выполнение хранимой процедуры aspnet_Roles_CreateRole, которая вставляет новую запись в таблицу aspnet_Roles, названную "Администраторы".

Остальная часть этого руководства посвящена использованию методов CreateRole, GetAllRoles и DeleteRole класса Roles для управления ролями в системе.

Шаг 4. Создание новых ролей

Роли предлагают способ произвольно группировать пользователей, и чаще всего эта группировка используется для более удобного способа применения правил авторизации. Но для использования ролей в качестве механизма авторизации сначала необходимо определить, какие роли существуют в приложении. К сожалению, ASP.NET не включает элемент управления CreateRoleWizard. Чтобы добавить новые роли, необходимо создать подходящий пользовательский интерфейс и вызвать API ролей самостоятельно. Хорошая новость заключается в том, что это очень легко достичь.

Замечание

Хотя нет веб-элемента управления CreateRoleWizard, существует средство администрирования веб-сайта ASP.NET, которое является локальным приложением ASP.NET, предназначенным для просмотра конфигурации веб-приложения и управления ими. Однако я не большой поклонник средства администрирования веб-сайта ASP.NET по двум причинам. Во-первых, в нём есть некоторые ошибки, и пользовательский опыт оставляет желать лучшего. Во-вторых, средство администрирования веб-сайта ASP.NET предназначено только для локальной работы, что означает, что вам придется создавать собственные веб-страницы управления ролями, если необходимо удаленно управлять ролями на динамическом сайте. По этим двум причинам в этом руководстве и следующем будет сосредоточено внимание на создании необходимых средств управления ролями на веб-странице, а не на основе средства администрирования веб-сайта ASP.NET.

ManageRoles.aspx Откройте страницу в Roles папке и добавьте текстовое поле и веб-элемент управления Button на страницу. Задайте для свойства ID элемента управления TextBox значение RoleName, а для свойств ID и Text элемента управления Button значения CreateRoleButton и Create Role соответственно. На этом этапе декларативная разметка страницы должна выглядеть следующим образом:

<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, чтобы создать обработчик событий 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;
}

Приведенный выше код начинается с назначения обрезанного имени роли, введенного в TextBox, переменной. Затем вызывается метод Roles класса RoleExists, чтобы определить, уже существует ли роль newRoleName в системе. Если роль не существует, она создается с помощью вызова CreateRole метода. CreateRole Если метод передает имя роли, которое уже существует в системе, ProviderException создается исключение. Поэтому код сначала проверяет, что роль еще не существует в системе перед вызовом CreateRole. Обработчик событий Click завершается очисткой свойства Text элемента TextBox RoleName.

Замечание

Может возникнуть вопрос о том, что произойдет, если пользователь не вводит никакое значение в Текстовое RoleName поле. Если значение, переданное в метод CreateRole, равно null или является пустой строкой, возникает исключение. Аналогичным образом, если имя роли содержит запятую, возникает исключение. Следовательно, страница должна содержать элементы управления проверкой, чтобы убедиться, что пользователь вводит роль и не содержит запятых. Я оставлю в качестве упражнения для читателя.

Создадим роль с именем "Администраторы". Перейдите на ManageRoles.aspx страницу через браузер, введите в текстовое поле "Администраторы" (см. рис. 3) и нажмите кнопку "Создать роль".

Создание роли администраторов

Рис. 3. Создание роли администраторов (щелкните, чтобы просмотреть изображение полного размера)

Что происходит? Происходит постбэк, но нет визуальной подсказки, что роль добавлена в систему. Мы обновим эту страницу на шаге 5, чтобы включить визуальный отзыв. Однако теперь можно убедиться, что роль была создана, перейдя SecurityTutorials.mdf в базу данных и отображая данные из aspnet_Roles таблицы. Как показано на рисунке 4, aspnet_Roles таблица содержит запись для только что добавленных ролей администраторов.

В таблице 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, вы увидите сетку с одним столбцом, помеченным элементом. Сетка содержит строку для роли администраторов, добавленной на шаге 4.

GridView отображает роли в одном столбце

Рис. 5. GridView отображает роли в одном столбце (щелкните, чтобы просмотреть изображение полного размера)

GridView отображает один столбец с меткой Item, так как свойство GridView AutoGenerateColumns имеет значение True (по умолчанию), что приводит к автоматическому созданию столбца для каждого свойства в нем DataSource. Массив имеет одно свойство, представляющее элементы в массиве, которое соответственно представлено в виде одного столбца в GridView.

При отображении данных с помощью GridView я предпочитаю явно определять мои столбцы, а не создавать их неявно с помощью GridView. Явно определяя столбцы, гораздо проще форматировать данные, переупорядочение столбцов и выполнять другие распространенные задачи. Поэтому давайте обновим декларативную разметку GridView, чтобы ее столбцы были явно определены.

Начните с задания свойства GridView AutoGenerateColumns значение False. Затем добавьте TemplateField в сетку, задайте его свойству значение Roles и настройте свойство ItemTemplate, чтобы оно отображало содержимое массива. Для этого добавьте веб-элемент управления Label с именем RoleNameLabel к ItemTemplate и привяжите его свойство Text к Container.DataItem.

Эти свойства и содержимое ItemTemplate могут быть заданы декларативно или через диалоговое окно "Поля GridView" и интерфейс "Изменение шаблонов". Чтобы открыть диалоговое окно "Поля", щелкните ссылку "Изменить столбцы" в смарт-теге GridView. Затем снимите флажок "Автогенерировать поля", чтобы установить значение False для свойства AutoGenerateColumns, и добавьте TemplateField в GridView, установив для свойства HeaderText значение Role. Чтобы определить ItemTemplateсодержимое, выберите параметр "Изменить шаблоны" из смарт-тега GridView. Перетащите веб-элемент управления Label на ItemTemplate, установите его свойство ID и настройте параметры привязки данных так, чтобы его свойство RoleNameLabel было привязано к Text.

Независимо от того, какой подход вы используете, декларативная разметка 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 значение "Delete Role".

Добавление кнопки

Рис. 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();
}

Код начинается с программной ссылки на веб-контрол в строке, в которой была нажата кнопка "Удалить роль". Затем вызывается метод Roles.DeleteRole, передавая параметры Text, RoleNameLabel и false, тем самым удаляя роль независимо от того, связаны ли какие-либо пользователи с ролью. Наконец, RoleList GridView обновляется, так что только что удаленная роль больше не отображается в таблице.

Замечание

Кнопка "Удалить роль" не требует подтверждения от пользователя перед удалением роли. Одним из самых простых способов подтверждения действия является диалоговое окно подтверждения на стороне клиента. Дополнительные сведения об этом методе см. в разделе "Добавление подтверждения Client-Side при удалении".

Сводка

Многие веб-приложения имеют определенные правила авторизации или функции уровня страницы, доступные только определенным классам пользователей. Например, может быть набор веб-страниц, к которым могут получить доступ только администраторы. Вместо того чтобы определять правила авторизации для каждого пользователя отдельно, зачастую более полезно определять правила на основе роли. Таким образом, вместо явного разрешения пользователям Скотта и Jisun доступа к административным веб-страницам более поддерживающий подход заключается в том, чтобы разрешить членам роли "Администраторы" доступ к этим страницам, а затем обозначить Скотта и Джисуна как пользователей, принадлежащих роли "Администраторы".

Платформа ролей упрощает создание ролей и управление ими. В этом руководстве мы рассмотрели, как настроить платформу ролей для использования базы SqlRoleProviderданных Microsoft SQL Server в качестве хранилища ролей. Мы также создали веб-страницу, которая перечисляет существующие роли в системе и позволяет создавать новые роли и удалять существующие. В последующих руководствах мы посмотрим, как назначить пользователей ролям и как применить авторизацию на основе ролей.

Счастливое программирование!

Дальнейшее чтение

Дополнительные сведения о разделах, описанных в этом руководстве, см. в следующих ресурсах:

Об авторе

Скотт Митчелл, автор нескольких книг ASP/ASP.NET и основатель 4GuysFromRolla.com, работает с технологиями Microsoft Web с 1998 года. Скотт работает независимым консультантом, тренером и писателем. Его последняя книга Sams Teach Yourself ASP.NET 2.0 за 24 часа. С Скоттом можно связаться на mitchell@4guysfromrolla.com или через его блог http://ScottOnWriting.NET.

Особое спасибо кому

Эта серия учебников была проверена многими полезными рецензентами. Основные рецензенты для этого руководства — Алиция Мазярж, Сути Банерджи и Тереза Мерфи. Хотите просмотреть мои предстоящие статьи MSDN? Если да, напишите мне на mitchell@4GuysFromRolla.com