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:
|
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.
Outra pergunta, é possivel no IIS ocultar arquivos javascript para que ninguém tenha acesso?
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.