Em um projeto desenvolvido recentemente foi necessário desenvolvermos uma área restrita onde somente usuários logados no sistema poderiam navegar.
Poderíamos ter usado a simples solução de colocar o código que verifica se o usuário está logado na Master Page. Normalmente no método Page_Load da Master Page. No entanto, o método Page Load é executado após o método Page Load da página principal (página ASPX), e por isso, todo o código que se encontra neste último é executado antes de verificar a autenticação do usuário. Este cenário pode gerar diversos problemas.
Esse cenário pode ser resolvido de diversas formas, mas a primeira que ocorre em nossas mentes é: Coloca o código de verificação em um UserControl (.ascx) e chama ele em todas as páginas do site. E a técnica realmente funciona. Mas... sim... é necessário alterar todas as páginas do site e publicar novamente estas páginas. Isto implica muitas vezes em novos testes e homologação por parte do cliente.
Uma saída mais elegante e rápida é utilizar um HTTP MODULE para implementar esta verificação. Parece algo complexo de se fazer, mas não é. Basta entender o que é um HTTP MODULE e como ele funciona. O roteiro segue abaixo, com uma pequena explicação e um exemplo simples:
Um HTTP MODULE é, resumindo, uma classe (compilada em uma dll) que contém uma estrutura específica para HTTP MODULE e métodos comuns, mas que serão acionados juntamente com algum evento de página. Para tanto, essa classe deve ser cadastrada no WEB.CONFIG.
Segue exemplo:
1) Desenvolva a classe e o método que faz o que você deseja. Abaixo, uma classe que faz uma verificação simples de autenticação de usuário:
----------------------------------------- CLASSE QUE SERÁ UTILIZADA PARA VERIFICAR A AUTENTICAÇÃO DO USUÁRIO----------------------------------
using System;
using System.Web;
using System.Web.UI;
using System.Web.Security;
public class AutenticacaoModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.PreRequestHandlerExecute += new EventHandler(context_PreRequestHandlerExecute);
}
void context_PreRequestHandlerExecute(object sender, EventArgs e)
{
Page page = HttpContext.Current.CurrentHandler as Page;
if (page != null)
{
//abaixo, você define qual método da classe será executado em qual evento
// neste caso, o método page_AutenticarUsuario será executado no evento PreInit da página, logo após a execução do método Page_PreInit.
page.PreInit += new EventHandler(page_AutenticarUsuario);
}
}
void page_AutenticarUsuario(object sender, EventArgs e)
{
Page page = sender as Page;
if (page != null )
{
if ((!page.User.Identity.IsAuthenticated) || (HttpContext.Current.Session["usuario"] == null))
{
FormsAuthentication.SignOut();
FormsAuthentication.RedirectToLoginPage();
HttpContext.Current.Response.End();
}
}
}
public void Dispose()
{
}
}
-------------------------------------FIM DA CLASSE---------------------------------------------
2) Compilando a classe:
Pode-se compilar a classe pelo próprio Visual Studio ou, para quem prefere, a versão via Prompt de Comando. Para tanto, a partir do diretório onde está a classe a ser compilada, digite csc /t:library classe.cs .
OBS: O arquivo csc deve estar configurado no PATH das variáveis de Ambiente
3) No Web.Config, localize a TAG httpModules e insira a seguinte linha:
<add name="MeuModuloDeAutenticacao" type="AutenticacaoModule"/>
onde em NAME coloca-se um nome que você queira e em TYPE coloca-se o tipo da classe.
PRONTO!!! Está feito um HTTP Module.
Entre outras aplicações, utilizamos também HTTP MODULE para fazer alteração dinâmica de Master Pages, entre outras. Em outro POST darei um exemplo deste.
Até a próxima.
Fernando D'Angelo