Método de Login
Olá, geralmente uso um sistema de login que tenho para gerenciadores de conteúdo e atividades que, geralmente, o usuário não extrapola o tempo da sessão... No entanto, recentemente venho desenvolvendo algumas pequenas aplicações de gerenciamento de informações online, e surgiu a necessidade do usuário poder ficar o dia todo conectado com o mesmo login... Para evitar perder dados quando a sessão termina, e o usuário, somente ao clicar no botão "salvar" do formulário é que tinha a triste constatação disso, implementei o auto-salvamento no formulários... Mas ainda assim, não é o suficiente, então estou desenvolvendo algo que possa permitir a conexão ininterrupta, ou pelo menos, que quando isso acontecer, o usuário possa voltar ao ponto que estava trabalhando... Atualmente faço assim: Login.asp formulário
<div id="login"> <h1><a href="login.asp" title=""><%=strTituloLogin%></a></h1> <% If 3-Session("tentativas") = 1 Then Response.Write "<p class=""message""><font color=#FF0000>Última</font> chance</p>" ElseIf 3-Session("tentativas") <= 0 Then Response.Write "<p class=""message"" style=""color: red. "" align='center'><strong>Sistema Travado</strong>!<br>Você não tem permissão para acessar o sistema! <br />Seus dados serão armazenados para investigação!<br />" Response.write "Seu IP: " & request.ServerVariables("REMOTE_ADDR")& "</p>" Else Response.Write "<p class=""message"">Restam " & 3-Session("tentativas") & " chances...</p>" End If if strMensagem <> "" then response.Write("<p class='message'>"& strMensagem & "</p>") if strErro <> "" then response.Write("<div id='login_error'>"& strErro & "<br /></div>")%>
<form action="login.asp" name="frmlogin" method="post"> <p> <label>Usuário<br> <input name="username" id="user_login" class="input" value="<%= Request.Cookies("sistema")("usuario") %>" size="20" tabindex="10" type="text"> </label> </p> <p> <label>Senha<br> <input name="password" id="user_pass" class="input" value="" size="20" tabindex="20" type="password"> </label> </p> <p class="forgetmenot"> <label> <% If Request.Cookies("sistema")("autologin") = "autologin" Then %> <input tabindex="90" type="checkbox" name="rememberme" value="a" checked> <% Else %> <input name="rememberme" value="a" tabindex="90" type="checkbox"> <% End If%> Manter conectado </label> <input type="hidden" name="lastUrl" value="<%=strIrPara%>"> </p> <p class="submit"> <input name="submit" <% If 3-Session("tentativas") <= 0 Then response.write "disabled " end if%> id="submit" value="Acessar" tabindex="100" type="submit"> </p> </form> <p id="nav" style="display:none. "> <a href="lembrarsenha.asp?msg=1" title="Encontrar sua senha">Perdi a minha Senha!</a></p> <% If 3-Session("tentativas") <= 0 Then Response.Write "<script language=""JavaScript"">"&vbcrlf Response.Write "document.getElementById('user_login').readOnly = true. " &vbcrlf Response.Write "document.getElementById('user_pass').readOnly = true. "&vbcrlf Response.Write "document.getElementById('rememberme').disabled = true. "&vbcrlf Response.Write "document.getElementById('submit').disabled = true. "&vbcrlf Response.Write "</script>"&vbcrlf End If%> </div> Script Response.Expires = -1
Response.ExpiresAbsolute = Now() - 2
Response.AddHeader "pragma","no-cache"
Response.AddHeader "cache-control","private"
Response.CacheControl = "No-Store" 'pega a página que deu origem ao clique para usar na redireção strIrPara = Request.ServerVariables("SCRIPT_NAME")
q = Request.ServerVariables("QUERY_STRING")
If q <> "" Then strIrPara = strIrPara & "?" & q If Request.Form("submit") <> "" Then bValidPwd = False ' Setup variables susername = Request.Form("Username") spassword = Request.Form("Password") If ValidateUser(sUsername, sPassword) Then ' escreve os cookies sLoginType = LCase(Request.Form("rememberme")) If sLoginType = "a" Then Response.Cookies("sistema")("autologin") = "autologin" Response.Cookies("sistema")("usuario") = sUsername Response.Cookies("sistema")("senha") = ew_Encode(TEAencrypt(sPassword, EW_RANDOM_KEY)) ' encript o cookie da senha Response.Cookies("sistema").Expires = DateAdd("d", 2, Date) Response.Cookies("sistema")("UserID") = strUserName Response.Cookies("ZonaSistema")("Key") = rand Response.Cookies("ZonaSistema")("GUID")= guid Response.Cookies("ZonaSistema").Expires = DateAdd("yyyy", 1, Now()) Else Response.Cookies("sistema")("autologin") = "" End If Session("statusdologin") = "logado" if session("usuarioativo") = 1 then '1 = true, 2=false if session("primeiroacesso") = 1 then Response.Redirect strSiteAdmin & "alterasenha.asp?.rand=" & rand & "&y=" & Session("swSistemas_EmpresaID") &"&ano="& strAno & "&_sid="& guid&"&msg=1" else Response.Redirect(strSiteAdmin & "dashboard/dashboard.asp") end if else response.Redirect(strSiteAdmin & "login.asp?msg=4&usuarioativo=1") end if Else 'não encontrou o usuário Session("tentativas") = Session("tentativas") + 1 'informa ao usuário response.Redirect(strSiteAdmin & "login.asp?err=4&semusuario=1") End If
Else If EstaLogado Then
'w "isLoggedin <br>" guid = CreateWindowsGUID() rand = RandomPW(10)+RandomPW(5) ' Session Key 10+5 mais seguro do que 15 if InStr(strIrPara, "login.asp") > 0 then strIrPara = strSiteAdmin & "logout.asp" end if Response.Redirect strIrPara Else ' checa auto login 'só será usada no autologin strUrlRetorno = strIrPara if strUrlRetorno = "" then if request.querystring("gb") <> "" then 'strUrlRetorno = request("gb") if InStr(request("gb"), "login.asp") > 0 then strUrlRetorno = strSiteAdmin & "dashboard/dashboard.asp?cmd=resetall" else strUrlRetorno = request("gb") end if else strUrlRetorno = strSiteAdmin & "dashboard/dashboard.asp?cmd=resetall" end if end if If Request.Cookies("sistema")("autologin") = "autologin" and Request.Cookies("sistema")("password") <> "" Then sUsername = Request.Cookies("sistema")("usuario") sPassword = Request.Cookies("sistema")("senha") sPassword = TEAdecrypt(ew_Decode(sPassword), EW_RANDOM_KEY) sCliente = Request.Cookies("sistema")("ativador") If ValidateUser(sUsername, sPassword) Then Response.Redirect strUrlRetorno else Response.Redirect(strSiteAdmin & "login.asp?msg=4&autologin=1") End If End If End IfEnd If Função ValidateUser Function ValidateUser(Username, Password) Dim CaseSensitive, AdminUsername, AdminPassword Dim rand Dim guid 'configurar ValidateUser = False CaseSensitive = False guid = CreateWindowsGUID() rand = RandomPW(10)+RandomPW(5) If Not ValidateUser Then Set conn = Server.CreateObject("ADODB.Connection") conn.open xDb_Conn_Str sFilter = "(
UsuarioLogin = '" & AdjustSql(Username) & "')" sSql = ewBuildSql(ewSqlSelect, ewSqlWhere, ewSqlGroupBy, ewSqlHaving, ewSqlOrderBy, sFilter, "") Set rs = conn.Execute(sSql) If Not rs.Eof Then Set objMD5 = New MD5 objMD5.Text = Password If CaseSensitive Then ValidateUser = (rs("UsuarioSenha") = objMD5.HEXMD5) Else ValidateUser = (LCase(rs("UsuarioSenha")) = LCase(objMD5.HEXMD5)) End If If ValidateUser Then session("primeiroacesso") = rs("UsuarioPrimeiroAcesso") session("usuarioativo") = rs("UsuarioAtivo") session("clienteID") = codCliente Session("" & Rand & "") = True '----------------------- Session("statusdologin") = "logado" Session("login") = rs("UsuarioLogin") Session("usuarioid") = rs("UsuarioID") strSQLatualiza = "Update `"& strUnique & "usuarios` SET UsuarioAtividade = 1, UsuarioRandKey = '" & Rand & "', UsuarioSID = '" & guid & "', UsuarioRemoteIp='" & Request.Servervariables("REMOTE_ADDR") & "', UsuarioTentativas = '" & now() & "' where usuariologin = '" & userid & "'" conn.execute strSQLatualiza End If End If rs.Close Set rs = Nothing conn.Close Set conn = Nothing End IfEnd Function Em cada página interna, coloco: Session.Timeout = 60 Response.Expires = 0
Response.ExpiresAbsolute = Now() - 1
Response.AddHeader "pragma", "no-cache"
Response.AddHeader "cache-control", "private, no-cache, no-store, must-revalidate" If Not EstaLogado And Request.Cookies("sistema")("autologin") = "autologin" And Request.Cookies("sistema")("senha") <> "" Then Response.Redirect strSiteAdmin & "login.asp?gb=" & request.servervariables("script_name")& "?" & request.querystring Função EstáLogado Function EstaLogado EstaLogado= (Session("statuslogin) = "logado")
End Function Problemas: - de vez em quando acontece de fazer o login, e não redirecionar para onde o usuário estava, causando o erro de "multiplos redirecionamentos", pois algo está errado na lógica, e o script fica "rodopiando" e levando sempre para o login.asp - Existe alguma forma de que, quando o a session expirar o usuário ser informado (por ajax talvez?) - já observei que em alguns casos, ele perde uma das sessions, por exemplo, tenho uma session de Setores, identificando o setor do usuário, e eu a perco algumas vezes, mas o login naum... - Como faço para garantir a integridade da session e proteger os dados do usuário, pois verificando esses dias com o firebux, dá pra saber quais dados foram postados, assim, um usuário pode acessar a máquina, ligar o firebug, e ver qual foram os dados postados pelo outro funcionário, por exemplo, pois geralmente funcionários esquecem de fechar o browser, muitas vezes, fazem o logout e deixam na página de entrada do sistema, e o histórico dos requests fica listado... - Qual a melhor forma para fazer um sistema de login, seguro e eficiente, que permita ao usuário ficar logado o dia todo: cookies, base de dados, session, etc? como o facebook faz isso? Nossa quantas dúvidas... qualquer esclarecimento é bem-vindo...
Discussão (3)
Carregando comentários...