Problemas com Session na utilização de IFRAME

por Fernando D'Angelo 28. maio 2010 12:21

Em um projeto recente desenvolvemos uma pequena aplicação em ASP.NET que deveria ser disponibilizada em portais parceiros. Esta aplicação foi instalada no nosso site e diversos parceiros, por questão de usabilidade e layout, decidiram inserir esta aplicação em um IFRAME. Essa aplicação dependia de algumas informações armazenadas na Session do usuário para o seu funcionamento correto, principalmente dados de autenticação.

No Firefox e no Google Chrome a aplicação funcionou corretamente, mas no IE (6.0, 7.0 e 8.0) o sistema não funcionava, pois as variáveis de Session não eram mantidas durante a navegação da aplicação.

Pesquisando pela WEB descobri que se trata de uma diretiva de segurança do IE que não permite que aplicações rodando em IFRAME e que estejam hospedadas em sites de terceiros armazenem Cookies na máquina do cliente, e como as variáveis de Session do ASP.NET, no seu uso padrão, dependem de Cookies, a utilização de Session ficou prejudicada. Esta diretiva de segurança é baseada na especificação P3P (Plataform for Privacy Preferences), da W3C (World Wide Web Consortium), e diz que somente sites que tenham descrito claramente como utilizarão os dados recebidos pelo IFRAME poderão ter acesso aos Cookies através de IFRAME. Esta descrição é em formato de código, e pode ser inserida no header da aplicação.

Em termos práticos, basta adicionar a linha abaixo ao seu código ASP.NET (normalmente no método PAGE_LOAD da MasterPage de uma página ASPX):

Response.AddHeader("P3P", "CP=\"IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT\"");

Outro ponto que achei importante repassar é que em um POST que eu li (infelizmente perdi o link deste POST), o usuário diz que o CHARSET da página que chama o IFRAME e das páginas internas do IFRAME devem ser o mesmo.

Mais informações em:

http://support.microsoft.com/kb/293222/

http://www.w3.org/P3P/

 

Abs,

Até a próxima.

Fernando D'Angelo

 

 

 

Tags: , ,

Navegadores | Programação | Segurança



Salvando imagens JPG do FLASH utilizando ASP.NET

por Fernando D'Angelo 22. abril 2010 12:55

Fazendo uma pesquisa sobre como salvar uma tela de animação FLASH em JPG, encontrei um interessante artigo que traz uma solução bastante simples.

Você pode visualizar esta solução em http://www.framecreatesdigital.com/post/2009/10/19/Saving-images-from-Flash-with-NET.aspx. Se trata de um tutorial montado por David Buchan e contém código comentado e arquivo ZIP para download com uma aplicação exemplo.

Abs,

Fernando D'Angelo

Tags: ,

Programação | Web Design



Alteração dinâmica de MasterPages

por Fernando D'Angelo 8. abril 2010 08:53

Seguindo no assunto HTTP MODULES, aqui vai uma dica muito importante.

Em um projeto que já estava no ar tivemos a necessidade de personalizar as páginas do site. Essa personalização seria efetuada exclusivamente nos itens de suporte do site (topo, rodapé, menu, breadcrumbs, ...). Todos esses itens se encontravam em uma MasterPage que estava aplicada ao site inteiro. 

A idéia que apareceu então foi de fazer uma nova MasterPage personalizada e alterá-la dinamicamente. Para isso, seria necessário acessar o método Page_PreInit das páginas ASPX afetadas e inserir um código que fizesse essa alteração dinamicamente. No entanto, o site conta com algumas centenas de páginas e não queríamos ter o trabalho de alterar todas as páginas do site e subir todo o site novamente para o ar, o que nos obrigaria a testá-lo novamente.

O que foi feito então? Utilizamos um HTTP MODULE que acopla um método novo ao evento Page_PreInit das páginas. O roteiro seguido foi bem parecido com o utilizado no exemplo do POST Autenticando Usuários com HTTP MODULE . Portanto, não vou reescrever os passos para criar o HTTP MODULE. Acessem este POST e terão todo o passo a passo. 

Abaixo, segue o código da classe MasterPageModule .cs , que é a base do HTTP MODULE:

 

------------------------------------------------------------------------

 

using System;

using System.Web;

using System.Web.UI;

 

public class MasterPageModule : 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)

        {

             //o codigo abaixo adiciona o método page_alterarMasterPage ao evento PreInit da Página
             //com isso, esse método será executado juntamente com o método Page_PreInit de todas as Páginas

             page.PreInit += new EventHandler(page_alterarMasterPage);

        }

    }

 

    void page_alterarMasterPage(object sender, EventArgs e)

    {
        //o código abaixo alterar a MasterPage da página ASPX para masterPagePersonalizada.master

        Page page = sender as Page;

        page.MasterPageFile = "masterPagePersonalizada.master";

    }

 

    public void Dispose()

    {

    }

}

------------------------------------------------------------------------------------------------

 

 

Abraços e até a próxima

Fernando D'Angelo

 

 

Tags:

API | Programação



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




Calendário

<<  julho 2010  >>
seteququsedo
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

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