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.