Compartilhar via


Criar e gerenciar funções (VB)

por Scott Mitchell

Observação

Desde que este artigo foi escrito, os provedores de associação ASP.NET foram substituídos pelo ASP.NET Identity. É altamente recomendável atualizar aplicativos para usar a plataforma ASP.NET Identity em vez dos provedores de associação apresentados no momento em que este artigo foi escrito. ASP.NET Identity tem várias vantagens em relação ao sistema de associação ASP.NET, incluindo :

  • Melhor desempenho
  • Extensibilidade e testabilidade aprimoradas
  • Suporte para OAuth, OpenID Connect e autenticação de dois fatores
  • Suporte à identidade baseada em declarações
  • Melhor interoperabilidade com o ASP.Net Core

Baixar código ou baixar PDF

Este tutorial examina as etapas necessárias para configurar a estrutura Funções. Depois disso, criaremos páginas da Web para criar e excluir funções.

Introdução

No tutorial Autorização Baseada no Usuário, examinamos o uso da autorização de URL para restringir determinados usuários de um conjunto de páginas e exploramos técnicas declarativas e programáticas para ajustar a funcionalidade de uma página de ASP.NET com base no usuário visitante. A concessão de permissão para acesso à página ou funcionalidade por usuário, no entanto, pode se tornar um pesadelo de manutenção em cenários em que há muitas contas de usuário ou quando os privilégios dos usuários mudam com frequência. Sempre que um usuário ganha ou perde autorização para executar uma tarefa específica, o administrador precisa atualizar as regras de autorização de URL apropriadas, a marcação declarativa e o código.

Geralmente, ajuda a classificar os usuários em grupos ou funções e, em seguida, aplicar permissões em uma base função por função. Por exemplo, a maioria dos aplicativos Web tem um determinado conjunto de páginas ou tarefas reservadas somente para usuários administrativos. Usando as técnicas aprendidas no tutorial Autorização Baseada no Usuário , adicionaremos as regras de autorização de URL apropriadas, a marcação declarativa e o código para permitir que as contas de usuário especificadas executem tarefas administrativas. Mas se um novo administrador foi adicionado ou se um administrador existente precisasse ter seus direitos de administração revogados, teríamos que retornar e atualizar os arquivos de configuração e as páginas da Web. No entanto, com as funções, poderíamos criar uma função chamada Administradores e atribuir esses usuários confiáveis à função Administradores. Em seguida, adicionaremos as regras de autorização de URL apropriadas, a marcação declarativa e o código para permitir que a função Administradores execute as várias tarefas administrativas. Com essa infraestrutura em vigor, adicionar novos administradores ao site ou remover os existentes é tão simples quanto incluir ou remover o usuário da função Administradores. Nenhuma configuração, marcação declarativa ou alterações de código são necessárias.

ASP.NET oferece uma estrutura de Funções para definir funções e associá-las a contas de usuário. Com a estrutura Funções, podemos criar e excluir funções, adicionar usuários ou remover usuários de uma função, determinar o conjunto de usuários que pertencem a uma função específica e informar se um usuário pertence a uma função específica. Depois que a estrutura Funções tiver sido configurada, poderemos limitar o acesso a páginas de forma função por função por meio de regras de autorização de URL e mostrar ou ocultar informações ou funcionalidades adicionais em uma página com base nas funções do usuário conectadas no momento.

Este tutorial examina as etapas necessárias para configurar a estrutura Funções. Depois disso, criaremos páginas da Web para criar e excluir funções. No tutorial Atribuindo funções a usuários, veremos como adicionar e remover usuários de funções. E no tutorial Autorização Baseada em Função, veremos como limitar o acesso a páginas em uma base função por função, juntamente com como ajustar a funcionalidade da página, dependendo da função do usuário visitante. Vamos começar!

Etapa 1: adicionando novas páginas de ASP.NET

Neste tutorial e nos próximos dois, examinaremos várias funções e funcionalidades relacionadas a funções. Precisaremos de uma série de páginas ASP.NET para implementar os tópicos examinados ao longo desses tutoriais. Vamos criar essas páginas e atualizar o mapa do site.

Comece criando uma nova pasta no projeto chamado Roles. Em seguida, adicione quatro novas páginas ASP.NET à Roles pasta, vinculando cada página à Site.master página master. Nomeie as páginas:

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

Neste ponto, a Gerenciador de Soluções do projeto deve ser semelhante à captura de tela mostrada na Figura 1.

Quatro novas páginas foram adicionadas à pasta Funções

Figura 1: Quatro novas páginas foram adicionadas à Roles pasta (clique para exibir a imagem em tamanho real)

Cada página deve, neste ponto, ter os dois controles content, um para cada um dos ContentPlaceHolders da página master: MainContent e LoginContent.

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" Runat="Server"> 
</asp:Content> 
<asp:Content ID="Content2" ContentPlaceHolderID="LoginContent" Runat="Server"> 
</asp:Content>

Lembre-se de que a LoginContent marcação padrão do ContentPlaceHolder exibe um link para fazer logon ou fazer logoff do site, dependendo se o usuário está autenticado. No entanto, a presença do Content2 controle Conteúdo na página ASP.NET substitui a marcação padrão da página master. Como discutimos em Um tutorial de Visão geral da Autenticação de Formulários , substituir a marcação padrão é útil em páginas em que não queremos exibir opções relacionadas ao logon na coluna à esquerda.

Para essas quatro páginas, no entanto, queremos mostrar a marcação padrão da página master para ContentPlaceHolderLoginContent. Portanto, remova a marcação declarativa para o Content2 controle Conteúdo. Depois de fazer isso, cada marcação de quatro páginas deve conter apenas um Controle de conteúdo.

Por fim, vamos atualizar o mapa do site (Web.sitemap) para incluir essas novas páginas da Web. Adicione o XML a seguir após o <siteMapNode> que adicionamos para os tutoriais de Associação.

<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>

Com o mapa do site atualizado, visite o site por meio de um navegador. Como mostra a Figura 2, a navegação à esquerda agora inclui itens para os tutoriais de Funções.

A navegação à esquerda agora inclui itens para os tutoriais de Funções.

Figura 2: Quatro novas páginas foram adicionadas à Roles pasta (clique para exibir a imagem em tamanho real)

Etapa 2: Especificando e configurando o provedor de estrutura de funções

Assim como a estrutura Associação, a estrutura Funções é criada em cima do modelo de provedor. Conforme discutido no tutorial Noções básicas de segurança e suporte ao ASP.NET, o .NET Framework é fornecido com três provedores de funções internos: AuthorizationStoreRoleProvider, WindowsTokenRoleProvidere SqlRoleProvider. Esta série de tutoriais se concentra no SqlRoleProvider, que usa um banco de dados do Microsoft SQL Server como o repositório de funções.

Abaixo do aborda a estrutura Funções e SqlRoleProvider funciona exatamente como a estrutura de associação e SqlMembershipProvider. O .NET Framework contém uma Roles classe que serve como a API para a estrutura Funções. A Roles classe tem métodos compartilhados como CreateRole, DeleteRole, GetAllRolesAddUserToRole, , IsUserInRolee assim por diante. Quando um desses métodos é invocado, a Roles classe delega a chamada para o provedor configurado. O SqlRoleProvider funciona com as tabelas específicas da função (aspnet_Roles e aspnet_UsersInRoles) em resposta.

Para usar o SqlRoleProvider provedor em nosso aplicativo, precisamos especificar qual banco de dados usar como repositório. O SqlRoleProvider espera que o repositório de funções especificado tenha determinadas tabelas de banco de dados, exibições e procedimentos armazenados. Esses objetos de banco de dados necessários podem ser adicionados usando a aspnet_regsql.exe ferramenta . Neste ponto, já temos um banco de dados com o esquema necessário para o SqlRoleProvider. De volta ao tutorial Criando o esquema de associação no SQL Server criamos um banco de dados chamado SecurityTutorials.mdf e usamos aspnet_regsql.exe para adicionar os serviços de aplicativo, que incluíam os objetos de banco de dados exigidos pelo SqlRoleProvider. Portanto, só precisamos informar a estrutura Funções para habilitar o suporte à função e usar o SqlRoleProvider com o SecurityTutorials.mdf banco de dados como o repositório de funções.

A estrutura Funções é configurada por meio do <roleManager> elemento no arquivo do Web.config aplicativo. Por padrão, o suporte à função está desabilitado. Para habilitá-lo, você deve definir o <roleManager> atributo do enabled elemento como true assim:

<?xml version="1.0"?>
<configuration>
 <system.web>
 ... Additional configuration markup removed for brevity ... 

 <roleManager enabled="true" />
 <system.web>
</configuration>

Por padrão, todos os aplicativos Web têm um provedor de funções chamado AspNetSqlRoleProvider do tipo SqlRoleProvider. Esse provedor padrão está registrado no (localizado em 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>

O atributo do connectionStringName provedor especifica o repositório de funções usado. O AspNetSqlRoleProvider provedor define esse atributo como LocalSqlServer, que também é definido em machine.config pontos e, por padrão, como um banco de dados SQL Server 2005 Express Edition na App_Data pasta chamada aspnet.mdf.

Consequentemente, se simplesmente habilitarmos a estrutura Funções sem especificar nenhuma informação de provedor no arquivo do Web.config aplicativo, o aplicativo usará o provedor de Funções registrado padrão, AspNetSqlRoleProvider. Se o ~/App_Data/aspnet.mdf banco de dados não existir, o runtime do ASP.NET o criará automaticamente e adicionará o esquema de serviços de aplicativo. No entanto, não queremos usar o aspnet.mdf banco de dados; em vez disso, queremos usar o SecurityTutorials.mdf banco de dados ao qual já criamos e adicionamos o esquema de serviços de aplicativo. Essa modificação pode ser realizada de duas maneiras:

  • Especificar um valor para oLocalSqlServernome da cadeia de conexão emWeb.config. Ao substituir o valor do nome da LocalSqlServer cadeia de conexão no Web.config, podemos usar o provedor de Funções registradas padrão (AspNetSqlRoleProvider) e fazer com que ele funcione corretamente com o SecurityTutorials.mdf banco de dados. Para obter mais informações sobre essa técnica, consulte a postagem no blog de Scott Guthrie, Configuring ASP.NET 2.0 Application Services to Use SQL Server 2000 or SQL Server 2005.
  • Adicionar um novo provedor registrado do tipoSqlRoleProvidere configurar seuconnectionStringNameconfiguração para apontar para oSecurityTutorials.mdfDatabase. Essa é a abordagem que recomendei e usei no tutorial Criando o esquema de associação no SQL Server e é a abordagem que usarei neste tutorial também.

Adicione a seguinte marcação de configuração de Funções ao Web.config arquivo . Essa marcação registra um novo provedor chamado SecurityTutorialsSqlRoleProvider.

<?xml version="1.0"?>
<configuration>
 <connectionStrings>
 <add name="SecurityTutorialsConnectionString"
 connectionString="..."/>
 </connectionStrings>

 <system.web>
 ... Additional configuration markup removed for brevity ...

 &nbsp &nbsp<roleManager enabled="true" defaultProvider="SecurityTutorialsSqlRoleProvider">
 &nbsp &nbsp &nbsp<providers>
 <add name="SecurityTutorialsSqlRoleProvider"
 type="System.Web.Security.SqlRoleProvider"
 applicationName="SecurityTutorials"
 connectionStringName="SecurityTutorialsConnectionString"/>
 </providers>
 </roleManager>
 <system.web>
</configuration>

A marcação acima define o SecurityTutorialsSqlRoleProvider como o provedor padrão (por meio do defaultProvider atributo no <roleManager> elemento ). Ele também define a SecurityTutorialsSqlRoleProviderconfiguração SecurityTutorialsde como applicationName , que é a mesma applicationName configuração usada pelo provedor de associação (SecurityTutorialsSqlMembershipProvider). Embora não seja mostrado aqui, o <add> elemento para o SqlRoleProvider também pode conter um commandTimeout atributo para especificar a duração do tempo limite do banco de dados, em segundos. O valor padrão é 30.

Com essa marcação de configuração em vigor, estamos prontos para começar a usar a funcionalidade de função em nosso aplicativo.

Observação

A marcação de configuração acima ilustra o uso dos <roleManager> atributos e defaultProvider do enabled elemento. Há vários outros atributos que afetam como a estrutura Funções associa informações de função de acordo com o usuário. Examinaremos essas configurações no tutorial autorização baseada em função.

Etapa 3: Examinando a API de Funções

A funcionalidade da estrutura Funções é exposta por meio da Roles classe , que contém treze métodos compartilhados para executar operações baseadas em função. Quando examinarmos a criação e a exclusão de funções nas Etapas 4 e 6, usaremos os CreateRole métodos e DeleteRole , que adicionam ou removem uma função do sistema.

Para obter uma lista de todas as funções no sistema, use o GetAllRoles método (consulte Etapa 5). O RoleExists método retorna um valor booliano que indica se existe uma função especificada.

No próximo tutorial, examinaremos como associar usuários a funções. Os Roles métodos , AddUserToRoles, AddUsersToRolee AddUsersToRoles da AddUserToRoleclasse adicionam um ou mais usuários a uma ou mais funções. Para remover usuários das funções, use os RemoveUserFromRolemétodos , RemoveUserFromRolesRemoveUsersFromRole, ou RemoveUsersFromRoles .

No tutorial Autorização Baseada em Função, examinaremos maneiras de mostrar ou ocultar a funcionalidade programaticamente com base na função do usuário conectado no momento. Para fazer isso, podemos usar os métodos , GetRolesForUser, GetUsersInRoleou IsUserInRole da FindUsersInRoleclasse Role.

Observação

Tenha em mente que sempre que um desses métodos for invocado, a Roles classe delega a chamada ao provedor configurado. Em nosso caso, isso significa que a chamada está sendo enviada para o SqlRoleProvider. Em SqlRoleProvider seguida, o executa a operação de banco de dados apropriada com base no método invocado. Por exemplo, o código Roles.CreateRole("Administrators") resulta na execução do aspnet_Roles_CreateRoleSqlRoleProvider procedimento armazenado, que insere um novo registro na aspnet_Roles tabela chamada Administradores .

O restante deste tutorial analisa o uso dos Roles métodos , GetAllRolese DeleteRole da CreateRoleclasse para gerenciar as funções no sistema.

Etapa 4: Criando novas funções

As funções oferecem uma maneira de agrupar arbitrariamente usuários e, mais comumente, esse agrupamento é usado para uma maneira mais conveniente de aplicar regras de autorização. Mas, para usar funções como um mecanismo de autorização, primeiro precisamos definir quais funções existem no aplicativo. Infelizmente, ASP.NET não inclui um controle CreateRoleWizard. Para adicionar novas funções, precisamos criar uma interface do usuário adequada e invocar a API de Funções. A boa notícia é que isso é muito fácil de realizar.

Observação

Embora não haja nenhum controle Web CreateRoleWizard, há a Ferramenta de Administração de Site ASP.NET, que é um aplicativo de ASP.NET local projetado para ajudar a exibir e gerenciar a configuração do aplicativo Web. No entanto, não sou um grande fã da Ferramenta de Administração de Sites ASP.NET por dois motivos. Primeiro, é um pouco difícil e a experiência do usuário deixa muito a desejar. Em segundo lugar, a Ferramenta de Administração de Site ASP.NET foi projetada para funcionar apenas localmente, o que significa que você terá que criar suas próprias páginas da Web de gerenciamento de funções se precisar gerenciar funções em um site ao vivo remotamente. Por esses dois motivos, este tutorial e o próximo se concentrarão na criação das ferramentas de gerenciamento de função necessárias em uma página da Web, em vez de depender do ASP.NET Ferramenta de Administração de Site.

Abra a ManageRoles.aspx página na Roles pasta e adicione uma Caixa de Texto e um controle Web button à página. Defina a propriedade do ID controle TextBox como RoleName e as propriedades e Text do ID Botão como CreateRoleButton e Criar Função, respectivamente. Neste ponto, a marcação declarativa da página deve ser semelhante à seguinte:

<b>Create a New Role:</b>
<asp:TextBox ID="RoleName" runat="server"></asp:TextBox>
<br />
<asp:Button ID="CreateRoleButton" runat="server" Text="Create Role" />

Em seguida, clique duas vezes no CreateRoleButton controle Button no Designer para criar um Click manipulador de eventos e, em seguida, adicione o seguinte código:

Protected Sub CreateRoleButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles CreateRoleButton.Click
 Dim newRoleName As String = RoleName.Text.Trim()

 If Not Roles.RoleExists(newRoleName) Then
 ' Create the role
 Roles.CreateRole(newRoleName)
 End If

 RoleName.Text= String.Empty 
End Sub

O código acima começa atribuindo o nome da função cortada inserido na RoleName TextBox à newRoleName variável. Em seguida, o Roles método da RoleExists classe é chamado para determinar se a função newRoleName já existe no sistema. Se a função não existir, ela será criada por meio de uma chamada para o CreateRole método . Se o CreateRole método for passado um nome de função que já existe no sistema, uma ProviderException exceção será gerada. É por isso que o código primeiro verifica se a função ainda não existe no sistema antes de chamar CreateRole. O Click manipulador de eventos é concluído desmarcando a RoleName propriedade textbox Text .

Observação

Talvez você esteja se perguntando o que acontecerá se o usuário não inserir nenhum valor no RoleName TextBox. Se o valor passado para o CreateRole método for Nothing ou uma cadeia de caracteres vazia, uma exceção será gerada. Da mesma forma, se o nome da função contiver uma vírgula, uma exceção será gerada. Consequentemente, a página deve conter controles de validação para garantir que o usuário insira uma função e que ela não contenha vírgulas. Eu saio como um exercício para o leitor.

Vamos criar uma função chamada Administradores. Visite a ManageRoles.aspx página por meio de um navegador, digite Administradores na caixa de texto (consulte Figura 3) e clique no botão Criar Função.

Criar uma função de administrador

Figura 3: Criar uma função administradores (clique para exibir imagem em tamanho real)

O que acontece? Ocorre um postback, mas não há nenhuma indicação visual de que a função tenha sido realmente adicionada ao sistema. Atualizaremos esta página na Etapa 5 para incluir comentários visuais. Por enquanto, no entanto, você pode verificar se a função foi criada acessando o SecurityTutorials.mdf banco de dados e exibindo os dados da aspnet_Roles tabela. Como mostra a Figura 4, a aspnet_Roles tabela contém um registro para as funções administradores adicionadas recentemente.

A tabela aspnet_Roles tem uma linha para os administradores

Figura 4: a aspnet_Roles tabela tem uma linha para os administradores (clique para exibir a imagem em tamanho real)

Etapa 5: Exibindo as funções no sistema

Vamos aumentar a ManageRoles.aspx página para incluir uma lista das funções atuais no sistema. Para fazer isso, adicione um controle GridView à página e defina sua ID propriedade como RoleList. Em seguida, adicione um método à classe code-behind da página chamada DisplayRolesInGrid usando o seguinte código:

Private Sub DisplayRolesInGrid()
 RoleList.DataSource = Roles.GetAllRoles()
 RoleList.DataBind()
End Sub

O Roles método da GetAllRoles classe retorna todas as funções no sistema como uma matriz de cadeias de caracteres. Essa matriz de cadeia de caracteres é associada ao GridView. Para associar a lista de funções ao GridView quando a página for carregada pela primeira vez, precisamos chamar o DisplayRolesInGrid método do manipulador de eventos da Page_Load página. O código a seguir chama esse método quando a página é visitada pela primeira vez, mas não em postbacks subsequentes.

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
 If Not Page.IsPostBack Then
 DisplayRolesInGrid()
 End If 
End Sub

Com esse código em vigor, visite a página por meio de um navegador. Como mostra a Figura 5, você deve ver uma grade com uma única coluna rotulada Item. A grade inclui uma linha para a função Administradores que adicionamos na Etapa 4.

O GridView exibe as funções em uma única coluna

Figura 5: o GridView exibe as funções em uma única coluna (clique para exibir a imagem em tamanho real)

O GridView exibe uma coluna solitária rotulada Item porque a propriedade GridView AutoGenerateColumns está definida como True (o padrão), o que faz com que o GridView crie automaticamente uma coluna para cada propriedade em seu DataSource. Uma matriz tem uma única propriedade que representa os elementos na matriz, daí a única coluna no GridView.

Ao exibir dados com um GridView, prefiro definir explicitamente minhas colunas em vez de tê-las geradas implicitamente pelo GridView. Ao definir explicitamente as colunas, é muito mais fácil formatar os dados, reorganizar as colunas e executar outras tarefas comuns. Portanto, vamos atualizar a marcação declarativa do GridView para que suas colunas sejam definidas explicitamente.

Comece definindo a propriedade gridView AutoGenerateColumns como False. Em seguida, adicione um TemplateField à grade, defina sua HeaderText propriedade como Funções e configure-a ItemTemplate para que ela exiba o conteúdo da matriz. Para fazer isso, adicione um controle Web de rótulo chamado RoleNameLabel ao ItemTemplate e associe sua Text propriedade a Container.DataItem.

Essas propriedades e o ItemTemplateconteúdo do podem ser definidos declarativamente ou por meio da caixa de diálogo Campos do GridView e da interface Editar Modelos. Para acessar a caixa de diálogo Campos, clique no link Editar Colunas na Marca Inteligente do GridView. Em seguida, desmarque a caixa de seleção Gerar campos automaticamente para definir a AutoGenerateColumns propriedade como False e adicione um TemplateField ao GridView, definindo sua HeaderText propriedade como Role. Para definir o ItemTemplateconteúdo do , escolha a opção Editar Modelos na Marca Inteligente do GridView. Arraste um controle Web label para o ItemTemplate, defina sua ID propriedade como RoleNameLabele defina suas configurações de vinculação de dados para que sua Text propriedade seja associada a Container.DataItem.

Independentemente da abordagem que você usa, a marcação declarativa resultante do GridView deve ser semelhante à seguinte quando você terminar.

<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>

Observação

O conteúdo da matriz é exibido usando a sintaxe <%# Container.DataItem %>de vinculação de dados . Uma descrição completa de por que essa sintaxe é usada ao exibir o conteúdo de uma matriz associada ao GridView está além do escopo deste tutorial. Para obter mais informações sobre esse assunto, consulte Associando uma matriz escalar a um controle da Web de dados.

Atualmente, o RoleList GridView só está associado à lista de funções quando a página é visitada pela primeira vez. Precisamos atualizar a grade sempre que uma nova função for adicionada. Para fazer isso, atualize o CreateRoleButton manipulador de eventos do Click Botão para que ele chame o DisplayRolesInGrid método se uma nova função for criada.

Protected Sub CreateRoleButton_Click(ByVal sender As Object,ByVal e As System.EventArgs) Handles CreateRoleButton.Click
 Dim newRoleName As String = RoleName.Text.Trim()

 If Not Roles.RoleExists(newRoleName) Then
 ' Create the role
 Roles.CreateRole(newRoleName)

 ' Refresh the RoleList Grid
 DisplayRolesInGrid()
 End If

 RoleName.Text = String.Empty 
End Sub

Agora, quando o usuário adiciona uma nova função, o RoleList GridView mostra a função recém-adicionada no postback, fornecendo comentários visuais de que a função foi criada com êxito. Para ilustrar isso, visite a ManageRoles.aspx página por meio de um navegador e adicione uma função chamada Supervisores. Ao clicar no botão Criar Função, um postback será exibido e a grade será atualizada para incluir Administradores, bem como a nova função, Supervisores.

A função Supervisores foi adicionada

Figura 6: A função Supervisores foi adicionada (clique para exibir a imagem em tamanho real)

Etapa 6: Excluindo funções

Neste ponto, um usuário pode criar uma nova função e exibir todas as funções existentes da ManageRoles.aspx página. Vamos permitir que os usuários também excluam funções. O Roles.DeleteRole método tem duas sobrecargas:

  • DeleteRole(roleName) – exclui roleName. Uma exceção será gerada se a função contiver um ou mais membros.
  • DeleteRole(roleName, throwOnPopulatedRole) – exclui roleName. Se throwOnPopulateRole for True, uma exceção será gerada se a função contiver um ou mais membros. Se throwOnPopulateRole for False, a função será excluída independentemente de conter membros ou não. Internamente, o DeleteRole(roleName) método chama DeleteRole(roleName, True).

O DeleteRole método também gerará uma exceção se roleName for Nothing ou uma cadeia de caracteres vazia ou se roleName contiver uma vírgula. Se roleName não existir no sistema, DeleteRole falhará silenciosamente, sem gerar uma exceção.

Vamos aumentar o GridView para ManageRoles.aspx incluir um botão Excluir que, quando clicado, exclui a função selecionada. Comece adicionando um botão Excluir ao GridView acessando a caixa de diálogo Campos e adicionando um botão Excluir, que está localizado na opção CommandField. Torne o botão Excluir a coluna mais à esquerda e defina sua DeleteText propriedade como Excluir Função .

Adicionar um botão Excluir ao RoleList GridView

Figura 7: Adicionar um botão Excluir ao RoleList GridView (Clique para exibir a imagem em tamanho real)

Depois de adicionar o botão Excluir, a marcação declarativa do GridView deve ser semelhante à seguinte:

<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>

Em seguida, crie um manipulador de eventos para o evento gridview RowDeleting . Esse é o evento gerado no postback quando o botão Excluir Função é clicado. Adicione o seguinte código ao manipulador de eventos.

Protected Sub RoleList_RowDeleting(ByVal sender As Object,ByVal e As System.Web.UI.WebControls.GridViewDeleteEventArgs) Handles RoleList.RowDeleting
 ' Get the RoleNameLabel
 Dim RoleNameLabel As Label = CType(RoleList.Rows(e.RowIndex).FindControl("RoleNameLabel"),Label)

 ' Delete the role
 Roles.DeleteRole(RoleNameLabel.Text,False)

 ' Rebind the data to the RoleList grid
 DisplayRolesInGrid()
End Sub

O código começa referenciando programaticamente o RoleNameLabel controle Web na linha cujo botão Excluir Função foi clicado. Em Roles.DeleteRole seguida, o método é invocado, passando o Text de RoleNameLabel e False, excluindo assim a função, independentemente de haver usuários associados à função. Por fim, o RoleList GridView é atualizado para que a função apenas excluída não apareça mais na grade.

Observação

O botão Excluir Função não requer nenhum tipo de confirmação do usuário antes de excluir a função. Uma das maneiras mais fáceis de confirmar uma ação é por meio de uma caixa de diálogo de confirmação do lado do cliente. Para obter mais informações sobre essa técnica, consulte Adicionando Client-Side confirmação ao excluir.

Resumo

Muitos aplicativos Web têm determinadas regras de autorização ou funcionalidade no nível da página que só está disponível para determinadas classes de usuários. Por exemplo, pode haver um conjunto de páginas da Web que somente os administradores podem acessar. Em vez de definir essas regras de autorização por usuário, geralmente é mais útil definir as regras com base em uma função. Ou seja, em vez de permitir explicitamente que os usuários Scott e Jisun acessem as páginas administrativas da Web, uma abordagem mais mantenedível é permitir que os membros da função Administradores acessem essas páginas e, em seguida, denotar Scott e Jisun como usuários pertencentes à função Administradores.

A estrutura Funções facilita a criação e o gerenciamento de funções. Neste tutorial, examinamos como configurar a estrutura Funções para usar o SqlRoleProvider, que usa um banco de dados do Microsoft SQL Server como o repositório de funções. Também criamos uma página da Web que lista as funções existentes no sistema e permite que novas funções sejam criadas e as existentes sejam excluídas. Nos tutoriais subsequentes, veremos como atribuir usuários a funções e como aplicar a autorização baseada em função.

Programação feliz!

Leitura Adicional

Para obter mais informações sobre os tópicos discutidos neste tutorial, consulte os seguintes recursos:

Sobre o autor

Scott Mitchell, autor de vários livros do ASP/ASP.NET e fundador da 4GuysFromRolla.com, trabalha com tecnologias da Microsoft Web desde 1998. Scott trabalha como consultor independente, treinador e escritor. Seu último livro é Sams Teach Yourself ASP.NET 2.0 em 24 Horas. Scott pode ser contatado em mitchell@4guysfromrolla.com ou através de seu blog em http://ScottOnWriting.NET.

Agradecimentos Especiais

Esta série de tutoriais foi revisada por muitos revisores úteis. Os principais revisores deste tutorial incluem Alicja Maziarz, Suchi Banerjee e Teresa Murphy. Interessado em revisar meus próximos artigos do MSDN? Nesse caso, solte-me uma linha em mitchell@4GuysFromRolla.com