Controle de acesso por funções no ASP.NET

Veja neste artigo como controlar o acesso às páginas e aos itens do menu da aplicação de acordo com a função do usuário conectado, configurando o web.config e utilizando sitemap.

Quando se desenvolve sistemas voltados para a web, uma das maiores preocupações dos desenvolvedores é, sem dúvida, a garantia da segurança da aplicação. Muitas vezes é necessário negar ou permitir acesso a certas páginas para determinados usuários, e fazer esta verificação de permissão em cada página ou em cada item do menu pode ser um tanto trabalhoso.

Para tornar possível este controle de acesso, o ASP.NET fornece um recurso bastante poderoso e de fácil utilização chamado MemberShip. Porém, não é o objetivo deste artigo explicar este recurso de maneira aprofundada. Explicarei aqui como controlar o acesso à páginas e a itens do menu de acordo com a função do usuário logado no sistema, configurando o web.config e utilizando sitemap.

Para iniciarmos, devemos criar um novo site ASP.NET através do menu File > New > Web Site no Visual Studio e selecionar a opção “ASP.NET Web Site”. Uma vez criado o projeto, observe que existe uma pasta chamada Account que contém algumas páginas que podem ser usadas para realizar o cadastro de usuários, alteração de senha e login. Todo esse processo é gerenciado pelo ASP.NET, para maiores detalhes sobre o funcionamento, sugiro uma pesquisa sobre o tema.

Criando usuários

Para que possamos implementar o controle de acesso, é preciso que existam usuários para realizar login no site. Para isso, podemos executar nosso projeto e cadastrar alguns usuários para teste.

Na página inicial, no canto superior direito, clique em “Log In” para se redirecionado à página de login. Uma vez estando nessa página, será dada a opção de realizar login no sistema ou criar uma nova conta, clicando no link “Register”, como mostra a Figura 1.


Figura 1: Opção Register para criar nova conta

A página de registro é de fácil utilização e dispensa maiores explicações. Crie então um usuário com o User Name “gerente”. Feito isso, repita o processo e crie outro usuário, dessa vez com User Name “vendedor”. Sugiro utilizar os nomes indicados para que possa acompanhar o artigo de forma mais segura.

Criando e atribuindo funções

Agora você pode fechar a página do site e interromper a execução a partir do Visual Studio. Já na IDE, acesse o menu Website > ASP.NET Configuration. Será aberta a página de administração do site, gerenciada pelo próprio ASP.NET.

Na primeira página, clique na opção “Security”. Na página que se abrirá, clique na opção “Enable Roles”. Surgirá então a opção “Create or Manage Roles”, clique nela para definir as funções dos usuários.

A página exibida é mostrada na Figura 2.


Figura 2: Criação de nova função

Neste momento, criaremos duas funções: Gerente e Vendedor (os nomes poderiam ser outros, utilizareis estes para melhor assimilar aos usuários). Para isso, basta informar o nome da função e clicar no botão “Add Role”.

Tendo criado as duas funções, volte à página Security clicando na aba de mesmo nome. Clique então em “Manage Users”, conforme mostra a Figura 3.


Figura 3: Opção Manage Users

Agora iremos atribuir funções aos usuários, como se pode imaginar, os usuários serão ligados à função homônima.

Clique então na popçao “Edit Roles” do primeiro usuário, como mostra a Figura 4.


Figura 4: Editar as funções do usuário

Como podemos ver na Figura 5, é possível ligar um usuário a mais de uma função. Porém, para os fins deste artigo, definiremos apenas uma função para cada usuário.


Figura 5: Atribuição de funções

Preparando a estrutura do site

Montaremos uma estrutura simples, mas que permitirá aplicar e compreender os conceitos e funcionalidades que serão apresentados a partir deste ponto.

Clicando com a direita sobre o projeto no Solution Explorer, selecione a opção “New Folder” e crie duas pastas: Produtos e Vendas. Clicando com a direita sobre a pasta Vendas, vá até a opção “Add New Item” e adicione dois novos formulários: NovaVenda.aspx e AlterarVenda.aspx. Repita o processo na pasta Produtos e crie os formulários Consulta.aspx e Cadastro.aspx. Por último, adicione um novo formulário de nome Relatorios.aspx na raiz do site, ou seja, fora de qualquer pasta.

Ao fim destes passos, a estrutura do site deve estar como na Figura 6.


Figura 6: Estrutura do site

Agora clique com a direita novamente sobre a raiz do projeto e, em seguida, na opção Add New Item. Selecione o item Sitemap e mantenha o nome Web.Sitemap.

Substitua o conteúdo do sitemap pelo conteúdo da Listagem 1, onde é montada estrutura do menu que dá acesso às várias páginas do sistema.

Listagem 1: Conteúdo do Web.sitemap

<?xml version="1.0" encoding="utf-8" ?> <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > <siteMapNode url="" title="" description=""> <siteMapNode url="~/Default.aspx" title="Principal" description="Página Principal" /> <siteMapNode url="" title="Produtos" description="" > <siteMapNode url="~/Produtos/Consulta.aspx" title="Consulta" description="Consultar Produtos" /> <siteMapNode url="~/Produtos/Cadastro.aspx" title="Cadastro" description="Cadastrar Produtos" /> </siteMapNode> <siteMapNode url="" title="Vendas" description="" > <siteMapNode url="~/Vendas/NovaVenda.aspx" title="Nova Venda" description="Nova Venda" /> <siteMapNode url="~/Vendas/AlterarVenda.aspx" title="Alteração" description="Altrar Venda" /> </siteMapNode> <siteMapNode url="~/Relatorios.aspx" title="Relatórios" description="Relatórios Gerenciais"/> </siteMapNode> </siteMap>

Em seguida, abra a MasterPage do site e selecione o menu principal, onde constam os itens Home e About. Clique na smart tag, e em seguida na opção “Chose Data Source”, selecione “New data source”.


Figura 7: Selecionar DataSource para o menu

Na janela que será aberta, escolha o item Sitemap e clique em Ok. Será adicionado um SiteMapDataSource, selecione-o e marque a propriedade ShowStartingNode como false.

A aparência do menu deve ficar como na Figura 8.


Figura 8: Aparência do menu após definição do data soruce

Executando o projeto, veremos que temos acesso a todos os itens do menu. Trabalharemos então para restringir o acesso às páginas, assim, ao clicar nos itens do menu, o usuário que não tiver permissão será redirecionado para a página anterior.

Gerenciando o acesso às páginas

Abra o web.config do projeto e dentro da tag configuration insira o código da Listagem 3.

Listagem 2: Gerenciando acesso à página de Relatórios

<location path="Relatorios.aspx"> <system.web> <authorization> <deny users="?"/> <deny roles="Vendedor"/> <allow roles="Gerente"/> </authorization> </system.web> </location>

Em seguida, clique com a direita sobre a pasta Produtos e em “Add New Item”. Selecione o item “Web Configuration File” e clique em Ok. No arquivo web.config da pasta Produtos, defina o seguinte conteúdo.

Listagem 3: Gerenciando o acesso às páginas da pasta Produtos

<?xml version="1.0"?> <configuration> <location path="Consulta.aspx"> <system.web> <authorization> <deny users="?"/> <allow roles="Gerente,Vendedor"/> </authorization> </system.web> </location> <location path="Cadastro.aspx"> <system.web> <authorization> <deny users="?"/> <deny roles="Vendedor"/> <allow roles="Gerente"/> </authorization> </system.web> </location> </configuration>

Para finalizar, repita o processo na pasta Vendas, mas utilizando o conteúdo da Listagem 5.

Listagem 4: Gerenciando o acesso às páginas da pasta Vendas

<?xml version="1.0"?> <configuration> <location path="NovaVenda.aspx"> <system.web> <authorization> <deny users="?"/> <allow roles="Gerente,Vendedor"/> </authorization> </system.web> </location> <location path="AlterarVenda.aspx"> <system.web> <authorization> <deny users="?"/> <deny roles="Vendedor"/> <allow roles="Gerente"/> </authorization> </system.web> </location> </configuration>

Agora você já pode executar o projeto e tentar acessar os itens do menu. Caso você esteja logado com um usuário sem permissão, será levado à página de login.

Alguns detalhes que merecem destaque nas listagens acima são listadas a seguir.

Gerenciando o acesso ao menu

Nesse ponto já conseguimos gerenciar o acesso às páginas, mas os itens do menu que dão acesso a elas continuam visíveis. O ideal seria evitar que usuários não autorizados tivessem acesso ao menu.

Veremos o quão fácil é realizar esta tarefa, realizando apenas algumas modificações no Web.config do projeto e no sitemap.

Então, no Web.config do projeto, adicione o seguinte código dentro da tag System.Web.

Listagem 5: Definição do SiteMapProvider

<siteMap defaultProvider="SiteMap1" enabled="true"> <providers> <add name="SiteMap1" description="Default SiteMap provider." type="system.Web.XmlSiteMapProvider " siteMapFile="Web.sitemap" securityTrimmingEnabled="true" /> </providers> </siteMap>

Agora, no Web.sitemap, adicionaremos a propriedade roles aos itens, conforme mostra a Listagem 7.

Listagem 6: Novo conteúdo do Web.sitemap

<?xml version="1.0" encoding="utf-8" ?> <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0"> <siteMapNode url="" title="" description="" roles="*"> <siteMapNode url="~/Default.aspx" title="Principal" description="Página Principal" roles="*"/> <siteMapNode url="" title="Produtos" description="" roles="Gerente,Vendedor"> <siteMapNode url="~/Produtos/Consulta.aspx" title="Consulta" description="Consultar Produtos" roles="Gerente,Vendedor"/> <siteMapNode url="~/Produtos/Cadastro.aspx" title="Cadastro" description="Cadastrar Produtos" roles="Gerente"/> </siteMapNode> <siteMapNode url="" title="Vendas" description="" roles="Gerente,Vendedor"> <siteMapNode url="~/Vendas/NovaVenda.aspx" title="Nova Venda" description="Nova Venda" roles="Gerente,Vendedor"/> <siteMapNode url="~/Vendas/AlterarVenda.aspx" title="Alteração" description="Altrar Venda" roles="Gerente"/> </siteMapNode> <siteMapNode url="~/Relatorios.aspx" title="Relatórios" description="Relatórios Gerenciais" roles="Gerente"/> </siteMapNode> </siteMap>

Feito isso, salve e execute o projeto. Logo de início, não estando logado, você só terá acesso ao item Principal cujo acesso é permitido a qualquer um que entre na página. Faça login como vendedor e verifique que só terá acesso a alguns itens. Por fim, faça login como gerente para ter acesso a todos os itens do menu.

Conclusão

Como vimos, gerenciar o acesso às páginas e aos itens do menu no ASP.NET, de acordo com o usuário conectado e sua função, não é uma tarefa difícil. O framework nos fornece recursos para tratar de forma prática essa parte dos sistemas web.

O objetivo deste artigo foi mostrar, na prática, como controlar o acesso pela função dos usuários conectados. Sugiro ao leitor que tenha interesse, pesquisar sobre Membership e Security Trimming no ASP.NET para aprimorar seus conhecimentos a respeito do tema.

Grato pela atenção, finalizo aqui este artigo. Até a próxima.

Artigos relacionados