Explorando Segurança do ASP.NET – AJAX


A onda do momento é o Framework Atlas para processamento de códigos server-side, sem a necessidade da reconstrução completa da página. Isso torna a aplicação Web muito parecida com aplicações Windows, deixando-a muito mais interativa.

Devido a isso, nas últimas versões do Atlas (ainda em versões não Release), a Microsoft implementou métodos dentro de um determinado objeto para trabalhar diretamente com a API de Membership, sem a necessidade de um refresh e a reconstrução da página toda. O objeto que disponibiliza estes serviços chama-se Sys.Services.AuthenticationService e é um objeto desenvolvido em Javascript. Este, por sua vez, têm três métodos, os quais analisaremos as suas utilidades na tabela abaixo:

Método Descrição
validateUser

Este método recebe dois parâmetros: login e senha, e se encarrega de validar junto ao Membership padrão que encontra-se configurado para a aplicação, se as credenciais informadas são ou não válidas, retornando um valor booleano com essa indicação.

login

Este método possui basicamente a mesma funcionalidade que o validateUser, mas com uma diferença: além de validar as credenciais e estas estiverem válidas, ele já devolve para o browser o cookie de autenticação especificado no FormsAuthentication. É importante dizer que este método também recebe um parâmetro booleano que indica se o cookie será ou não persistente.

logout Efetua a saída do usuário, limpando o cookie.

Quando adicionamos um projeto ASP.NET Atlas no Visual Studio .NET 2005, a autenticação via Altas vem desabilitada no Web.Config e é necessário habilitarmos para fazer o uso do objeto de autenticação. Para se certificar disso, é necessário que o arquivo Web.Config da aplicação ASP.NET Atlas contenha as seguintes entradas:

<sectionGroup 
    name="microsoft.web" 
    type="Microsoft.Web.Configuration.MicrosoftWebSectionGroup">
    <!-- outras seções -->
    <section 
	name="webServices" 
	type="Microsoft.Web.Configuration.WebServicesSection" 
	requirePermission="false" />
    <section 
	name="authenticationService" 
	type="Microsoft.Web.Configuration.AuthenticationServiceSection" 
	requirePermission="false" />
</sectionGroup>

<!-- 
    
    Certifique-se de que o Provider padrão esteja configurado
    corretamente e apontando para uma base de dados válida.

    As seções de configurações de SqlMembershipProvider
    foram suprimidas para poupar espaço, mas não muda nada
    em relação aos exemplos anteriores.
    
-->

<webServices enableBrowserAccess="true" />
<authenticationService enabled="true" />

Notem que há um elemento chamado webServices que neste cenário, é responsável por efetuar a autenticação. Na página que fará a autenticação via Atlas você notará que não se tem código em VB.NET ou C#, tudo será escrito utilizando Javascript. Acredito que, como já aconteceu com alguns controles, nas próximas versões isso já esteja encapsulado em controles drag-and-drop. Para iniciarmos o entendimento da estrutura cliente, a página irá conter um controle do tipo ScriptManager, o qual tem a finalidade de expor (código cliente) grande parte das funcionalidades e controles do Atlas.

É através do controle ScriptManager que temos acesso ao objeto Sys.Services.AuthenticationService. Agora que já temos acesso à ele, resta codificar para efetuarmos o login do usuário. Como qualquer outro sistema de Login, é necessário termos dois controles TextBox e um Button. Teremos também Label para exibirmos a mensagem de autenticado/não autenticado para o usuário saber se foi ou não autenticado com sucesso. O código é mostrado abaixo:

<html xmlns="http://www.w3.org/1999/xhtml">
    <head id="Head1" runat="server">
        <atlas:ScriptManager 
            ID="scriptManager" 
            runat="server" 
            EnableScriptComponents="false" >
        </atlas:ScriptManager>
    </head>
<body>
    <form id="form1" runat="server">
        <span id="TextoLogado" 
            style="visibility:hidden;color:Green" 
            visible="false">
            <b>Logado.</b>
        </span> 
        <span 
            id="TextoNaoLogado" 
            style="visibility:visible;color:Red">
            <b>Não logado.</b>
        </span>
        <br /><br />        
        
        Login: <input type="text" id="txtLogin" />
        <br />
        Senha: <input type="password" id="txtSenha" />
        <br /><br />
        <button id="btnEnviar" onclick="OnSubmitLogin()">Efetuar Login</button>

        
            var login = document.getElementById('txtLogin');
            var senha = document.getElementById('txtSenha');
            var lblLogado = document.getElementById('TextoLogado');
            var lblNaoLogado = document.getElementById('TextoNaoLogado');
            var buttonLoginLogout = document.getElementById('btnEnviar');            
                
            function OnSubmitLogin() { 
                Sys.Services.AuthenticationService.login(
                    login.value, 
                    senha.value, 
                    false, 
                    OnLoginComplete); 
                    
                return false;
            }
            
            function OnLoginComplete(result) {                
                senha.value = '';
                if (result) {
                    login.value = '';
                    lblLogado.style.visibility = "visible";
                    lblNaoLogado.style.visibility = "hidden";  
                   
                    buttonLoginLogout.innerText = "Efetuar Logout";         
                    buttonLoginLogout.onclick = OnSubmitLogout;
                }
                else {
                    lblLogado.style.visibility = "hidden";
                    lblNaoLogado.style.visibility = "visible"; 
                }
            }
           
            function OnSubmitLogout() {  
                Sys.Services.AuthenticationService.logout(OnLogoutComplete); 
                return false;
            }
           
            function OnLogoutComplete(result) {
                lblLogado.style.visibility = "hidden";
                lblNaoLogado.style.visibility = "visible";  
                buttonLoginLogout.innerText = "Efetuar Login";  
                buttonLoginLogout.onclick = OnSubmitLogin;
            }
        
   </form>
</body>
</html>

No exemplo acima utilizamos o método login para autenticar o usuário e, via Javascript, fazemos as manipulações necessárias para assim que o método login retornar o valor (com sucesso ou não), o layout é ajustado, exibindo uma mensagem de que o usuário foi autenticado com sucesso.

Informamos ao método login, além do login e senha do usuário (recuperado dos TextBoxes), um parâmetro booleano que indica se o cookie vai ou não ser persistente. O último parâmetro é a função de callback, a qual será disparada assim que o método de login finalizar o processamento, já que o mesmo é processado assincronamente. Já para o método logout (que irá chamar o método Logout da classe FormsAuthentication), você passa apenas o método que será disparado assim que o método for finalizado, e é neste método que você fará a manipulação do layout para dar um feedback ao usuário que, no caso acima, apenas alteramos o valor do Label para “Não Logado.”.

Este exemplo foi baseado na versão de 06/04/2006 do Atlas e os códigos mostrados acima são baseados no exemplo exibido nos QuickStarts do Atlas. É possível que nas versões futuras do Atlas este objeto de autenticação client-side possa mudar.

Anúncios

3 comentários sobre “Explorando Segurança do ASP.NET – AJAX

    • Olá Israel,

      A pouco tempo trabalho com dev. para web e tenho me interessado muito sobre ajax. Contudo, sempre tive duas preocupações na minha careca cabecinha, html limpo e segurança em chamadas assíncronas. Utilizo a algum tempo os controles do ajaxcontroltoolkit e estou muito frustado com toda a "sujeira" que é posta na página que crio. Existe alguma maneira de utilizar esses controles sem deixar "sujeira" na página? E quanto a segurança dessas chamadas, o que você aconselharia?

      Att.,
      Diogo

    • Boas Diogo,

      Eu não conheço a fundo o Toolkit, mas seria interessante procurar por artigos onde as pessoas falam sobre técnicas para tentar melhorar esse tipo de coisa. Uma alternativa, seria a utilização do jQuery, que já traz bastante recursos prontos, te dando um maior controle em cima das requisições e manipulação do HTML utilizando JavaScript. A única diferença é que ele não possui os controles que o ASP.NET AJAX Toolkit te dá.

      Com relação a segurança, eu desconheço qualquer coisa que "proteja" os arquivos *.js. Isso se deve ao fato de que ele precisa estar presente no browser para que ele seja executado. Lembre-se de ele é interpretado e não compilado. O que já vi pessoas fazeres, para dar um "ar de segurança", é "compactar" o arquivo *.js, removendo os espaços em brancos, quebras de linha, etc. Não é segurança, é apenas uma forma de você diminuir o tamanho e, consequentemente, o tempo do download dos arquivos.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s