Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Ronaldo Faria Storck Eler

Método de Login

Recommended Posts

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

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 atividade

com 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

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

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

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.