Autenticação através de HTTP Modules

por Fernando D'Angelo 31. março 2010 22:12

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


 

 

 


 

 

Tags: ,

API | Programação



Compressão de páginas dinâmicas .ASPX

por Fernando D'Angelo 18. março 2010 09:57

Muitas vezes nos deparamos com páginas dinâmicas que possuem grandes listagens e consequentemente se tornam pesadas. Esse cenário é ideal para que apareçam reclamações dos clientes informando que determinada página está lenta de ser visualizada e nós desenvolvedores nos vimos em um beco sem saída, pois o acesso à base de dados está rápida, a diagramação da página está a mais enxuta possível e o cliente continua reclamando de um problema inerente ao conteúdo da página.

Uma saída interessante é utilizar compactação dinâmica de conteúdo. Atualmente todos os browsers são compatíveis com compactação GZIP e portanto, os servidores WEB podem enviar conteúdo compactado que o browser fará a descompactação automaticamente, de forma transparente ao usuário.

Mas conteúdo dinâmico precisa ser compactado dinamicamente, e para tanto é necessário desenvolver um módulo HTTP que faça este papel.

Graças ao mundo colaborativo dos desenvolvedores WEB, existe um componente deste pronto no mercado. E o melhor é que é gratuito e código fonte aberto (sob a licença The Code Project Open Licence). Se trata de um componente desenvolvido por Derik C., e é um excelente componente. Ele compacta páginas dinâmicas (.aspx), arquivos .js e .css. O componente é muito bom e o utilizo em diversos sites onde o cenário acima é apresentado.

Sua utilização é simples, e não requer alterações no site. Apenas suba os arquivos dll para a pasta BIN e faça algumas alterações no WEB.CONFIG.

A compactação das páginas gira em torno dos 90%. Ou seja, uma listagem de 2Mb se torna um arquivo Gzipado de 180Kb aproximadamente, aumentando em muito a velocidade de transferência e consequentemente de abertura da página no Browser.

Maiores informações sobre este componente, download e orientações de uso podem ser encontrados na página oficial deste componente: http://www.codeproject.com/KB/aspnet/httpcompression.aspx 

 

Abs e até a próxima.

 

Fernando D'Angelo

 

Tags: , , , ,

API | Programação



Ferramenta de geração de script INSERT para dados contidos em SQLSERVER 2005

por Fernando D'Angelo 11. março 2010 09:25

A Microsoft disponibiliza para download gratuito uma ferramenta que permite gerar scripts da estrutura e dos dados de uma base de dados SQLSERVER 2005.

Essa ferramenta é extremamente útil em uma migração ou publicação de sites, por exemplo.

Ela permite:

 

1) Gerar script de toda a estrutura da base de dados (tabelas, user datatypes, constraints, pks, stored procedures, ...)

2) Gerar script de INSERT para todos os dados armazenados nesta base

 

Abaixo, o link para Download

 

http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=56e5b1c5-bf17-42e0-a410-371a838e570a

 

Abs,

 

Fernando D'Angelo

Tags: , ,

Banco de Dados



VIEWSTATE - Pra que serve, quando usar e quando não usar

por Fernando D'Angelo 9. março 2010 08:54

O QUE É?

O Viewstate é uma funcionalidade do ASP.NET que permite que, ao dar POSTBACK em uma página, os componentes de formulário ASP.NET mantenham seus valores.

Para fazer a conexão entre os componentes ASP.NET que estão instanciados na memória do servidor e os componentes HTML que estão no Browser, a microsoft utiliza uma variável HIDDEN (escondida) no HTML com os nomes dos viewstates de todos os objetos da tela.

Isso significa que quanto mais objetos temos na tela, maior é o valor da variável VIEWSTATE.

Como Usar e como desabilitar?
Por padrão o Viewstate é True. Para desabilitar o Viewstate de uma página, coloque a TAG EnableViewState="false" na diretiva PAGE da página.

Se você quiser desabilitar o Viewstate somente em alguns componentes, você pode colocar a TAG EnableViewState="false" na chamada do componente. Caso o componente seja um componente que contenha outros componentes dentro (caso do Repeater e outros), todos os demais que estão dentro deste serão desabilitados.

Quando Usar?
Sempre que você quiser manter o valor do componente, mesmo que ocorra um POSTBACK.

Quando Não usar?
Em casos onde há listagens com componentes ASP.NET, o tamanho da variável ViewState pode ser um problema. Nestes casos, sugerimos que os componentes que somente mostrarão dados na tela sejam desabilitados, como os Labels, Literals, ... 

Abs,

Fernando D'Angelo

 

Tags:

Programação



Buscas no SQLSERVER sem distinção de caracteres com acentuação

por Fernando D'Angelo 2. março 2010 08:26

É comum em sites a existência de busca de conteúdo por palavra-chave.

Neste cenário, muitas pessoas quebram a cabeça para fazer com que a busca por palavras ignore a acentuação, ou seja, se o usuário digitar a palavra sem acentuação e no banco de dados ela estiver com acentuação, o sistema deverá encontrar tal registro. O contrário também deve ser válido.

Ao contrário do que muitos imaginam, a não distinção de caracteres com e sem acentuação é uma configuração do SQLSERVER e não é necessário criar métodos no código do site para isto. Basta para isso alterar o COLLATE dos campos de busca para um COLLATE que não faça essa distinção.

O COLLATE padrão do Português-BR no SQLSERVER 2005 é SQL_Latin1_General_CP1_CI_AS, onde o AS significa "Accent Sensitive", ou seja, Sensível à acentuação. Precisamos então alterar o COLLATE para SQL_Latin1_General_CP1_CI_AI, onde o AI significa "Accent Insensitive", ou seja, insensível à acentuação. Esta alteração basta para que a busca funcione corretamente.

No entanto, para complicar um pouco, a base de dados já está criada e com o COLLATE padrão do servidor de hospedagem, que não permite controle total da base de dados.

Assim sendo, não conseguimos ou é muito trabalhoso alterar o COLLATE da base de dados, da tabela ou da coluna.

Uma solução rápida é alterar alterar o COLLATE do campo na própria sintaxe SQL.

Para fazer uma busca em um banco de dados, com LIKE, sem que o sistema faça distinção entre palavras com e sem acento (ex: procurar por "acustica" e achar "acústica"), faça como no exemplo abaixo. É só inserir o COLLATE abaixo na string SQL.


... WHERE TX_NOME  COLLATE SQL_Latin1_General_CP1_CI_AI LIKE  '%acustica%' ...

 

Abs,

 

Fernando D'Angelo

Tags: , ,

Banco de Dados




Calendário

<<  setembro 2010  >>
seteququsedo
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

Ver os posts em um calendário maior

Para divulgar oportunidades aqui, entre em contato conosco enviando a descrição completa da vaga + uma data de validade para cada uma delas.

* As vagas divulgadas neste espaço são de inteira responsabilidade das empresas anunciantes.

Assine Nossa Newsletter

Quero ser notificado quando um novo Post for publicado