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.

Opção Register para criar nova conta

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.

Criação de nova função

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.

Opção Manage Users

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.

Editar as funções do usuário

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.

Atribuição de funções

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.

Estrutura do site

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

Selecionar DataSource para o menu

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.

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

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.

  • A propriedade allow define quais usuários ou funções terão acesso a esta página.
  • A propriedade deny, por sua vez, nega o acesso à página em questão.
  • O sinal de interrogação utilizado indica que o acesso foi negado a usuários não registrados, ou seja, para o acesso anônimo.
  • O sinal de asterisco indica que o acesso à página foi negado ou permitido para todas as funções ou usuários.

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.