Поделиться через


Создание ролей и управление ими (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> для атрибута enabledtrue элемента следующий вид:

<?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> ). Он также задает SecurityTutorialsSqlRoleProviderapplicationName для параметра значение 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 содержит запись для только что добавленных ролей администраторов.

Таблица 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.

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

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

GridView отображает отдельный столбец с меткой Item, так как свойство GridView AutoGenerateColumns имеет значение True (по умолчанию), что приводит к автоматическому созданию столбца для каждого свойства в элементе DataSourceGridView. Массив имеет одно свойство, представляющее элементы массива, то есть один столбец в 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 свойства значение Удалить роль .

Добавление кнопки удаления в RoleList GridView

Рис. 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 вызывается метод , передавая TextRoleNameLabelfalseв и , тем самым удаляя роль независимо от того, связаны ли с этой ролью пользователи. Наконец, RoleList GridView обновляется, чтобы только что удаленная роль больше не отображалась в сетке.

Примечание

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

Сводка

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

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

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

Дополнительные материалы

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

Об авторе

Скотт Митчелл(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