Ronaldo Faria Storck Eler 2 Denunciar post Postado Julho 15, 2013 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 If End 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 If End 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... Compartilhar este post Link para o post Compartilhar em outros sites
xanburzum 169 Denunciar post Postado Julho 15, 2013 aconselho a fazer com base de dados, estilo o antigo msn, por exemplo se o user tentar logar novamente ou tentar logar de outra máquina fica sabendo e aumentar o tempo de session, mas tome cuidado no caso de usuário ser deslogado por inatividade, e isso é um grande dilema, por mais que o user fique no máximo seria 16:00 horas logado , já é um bom tempo para o user ver artigo,estudar pelo site etc,tem gente que põe 24h, ou um parâmetro razoável para não derrubar quem esta, Além dessa verificação,(colocar um campo de logon no database), eu faria uma validação adicional por micro armazenando também o IP do cidadão... precisa definir um tempo razoável para acesso em cada pagina e cada vez que o usuário mudar de pagina armazena a data/hora desta ultima atividadecom base nesta informação e no tempo máximo de inatividade que permitir conseguirá definir que ficou off e quem segue on. E veja se tem ip dinâmicos. Em ASP.Net vc terá um maior gerenciamento de sessão, na onde será necessário manter o estado de objetos mesmo depois do envio para o servidor. Muitas vezes essas informações que desejamos guardar são pertinentes apenas para a página atual, ou seja, quando desejamos guardar as informações de objetos em uma mesma página e não na aplicação toda. Compartilhar este post Link para o post Compartilhar em outros sites
Ronaldo Faria Storck Eler 2 Denunciar post Postado Julho 15, 2013 Olá Xanburzum, Eu gostaria de ter a opção de o usar ficar conectado o tempo que ele quiser dentro de uma determinada data, ou seja, fica logado hoje, mesmo que desligue a máquina, ao voltar, já está logado... mas se for usar amanhã, tem que logar novamente... essa questão da inatividade, é complicado, pois as vezes a pessoa abre o sistema, trabalha um pouco, sai da sala, vai almoçar e quando chega depois de 5 hora fora quer voltar de onde parou...nessa hora, o sistema desktop tem suas vantagens... Eu tenho, em média, 05 objetos session, que eu preciso manter globalmente, durante toda a navegação... e sobre a atividade, eu tenho um campo que, se a pessoa tentar logar de outra máquina ela é avisada, mas isso pode ocorrer, por exemplo, se ela logou no firefox e agora está logando no chrome... Sobre o estilo do antigo msn, tem algum código em algum lugar que eu possa consultar? Eu teria como fazer um sistema (que pudesse personalizar) em asp.net e usar em conjunto com o asp? seria a melhor opção? Obrigado, Compartilhar este post Link para o post Compartilhar em outros sites
xanburzum 169 Denunciar post Postado Julho 16, 2013 Em ASP.Net terá um gerenciamento melhor e você consegue tranquilamente usar as duas extensões .asp e .aspx Compartilhar este post Link para o post Compartilhar em outros sites