Em meu artigo anterior "Usando o cache para verificar se os usuários fazem login repetidamente", depois de praticar e pensar, descobri que esqueci um ponto muito importante: definir apenas um valor de login para o cache ao fazer login. Se o tempo de expiração do cache for definido por um longo período, depois que o usuário fizer logout e login novamente em um curto intervalo de tempo, ele descobrirá que não poderá fazer login. No entanto, se o tempo de expiração for definido para um curto período de tempo, o login malicioso fará login novamente em um período de tempo mais curto e passará no teste com êxito. Obviamente este método de julgamento é imperfeito.
Como precisamos melhorar esse problema de tempo? Defina um intervalo de expiração curto e, em seguida, verifique o cache em intervalos regulares e reescreva as informações de login do usuário no cache. Portanto, desde que o usuário não saia do sistema do site ou feche o navegador, este método de julgamento será sempre eficaz! Então, na WEB e no ASP.NET, o que pode alcançar convenientemente o efeito do temporizador? Por enquanto, a melhor escolha é sem dúvida o controle Timer no ATLAS! Você pode definir o início do cronômetro, o intervalo de tempo e os eventos a serem realizados após o intervalo de tempo.
Após a melhoria do programa, ele será compartilhado da seguinte forma, consulte as notas do programa:
Primeira página
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN " " http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd ">
<html xmlns=" http://www.w3.org/1999/xhtml ">
<head runat="servidor">
<title>Página sem título</title>
</head>
<corpo>
<form id="form1" runat="servidor">
<asp:ScriptManager ID="ScriptManager1" runat="servidor" />
<div>
<asp:UpdatePanel ID="UpdatePanel1" runat="servidor">
<ContentTemplate>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Login" />
<br />
<br />
<asp:Label ID="Label1" runat="server" Width="350px"></asp:Label>
<asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="Limpar Cache" />
<asp:Timer ID="Timer1" runat="server" Enabled="False" Interval="15000" OnTick="Timer1_Tick">
</asp:Temporizador>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</form>
</body>
</html>
Programa em segundo plano
usando Sistema;
usando System.Data;
usando System.Configuration;
usando System.Web;
usando System.Web.Security;
usando System.Web.UI;
usando System.Web.UI.WebControls;
usando System.Web.UI.WebControls.WebParts;
usando System.Web.UI.HtmlControls
classe parcial pública _Default: System.Web.UI.Page;
{
protegido void Page_Load (remetente do objeto, EventArgs e)
{
}
protegido vazio Button1_Click (objeto remetente, EventArgs e)
{
tentar
{
//nome de usuário
string sName = TextBox1.Text;
//Gerar chave
string sKey = sName + "_Login";
//Obtém o valor da chave fornecida no cache
string sUser = Convert.ToString(Cache[sKey]);
//Verifica se existe
if (sUser == null || sUser == String.Empty)
{
Session["username"] = sName;
//Não há nenhum item para esta chave no cache, indicando que o usuário não está logado ou o tempo de login expirou.
//TimeSpan representa um intervalo de tempo e obtém o valor de configuração do sistema para o tempo limite da sessão.
//(Se você considerar que o tempo permitido para os usuários fazerem login novamente é menor que o tempo limite da sessão, esse valor pode ser definido como menor)
//TimeSpan SessTimeOut = new TimeSpan(0, 0, System.Web.HttpContext.Current.Session.Timeout, 0, 0);
//Para demonstração aqui, o intervalo de salvamento do cache está definido para 20 segundos.
TimeSpan SessTimeOut = novo TimeSpan(0, 0, 0, 20, 0);
HttpContext.Current.Cache.Insert(
sChave,
sChave,
nulo,
DateTime.MaxValue,
SessTimeOut,
System.Web.Caching.CacheItemPriority.NotRemovable,
nulo
);
//Iniciar temporizador
this.Timer1.Enabled = true;
//Ao fazer login pela primeira vez, você pode fazer o trabalho que deseja.
Label1.Text = "Olá!"
}
outro
{
//O registro do usuário é encontrado no Cache, indicando que ele já efetuou login e está proibido de efetuar login novamente.
Label1.Text = "Desculpe, sua identidade de usuário foi logada";
retornar;
}
}
capturar (System.Exception ex)
{
Label1.Text = ex.Mensagem;
}
}
protegido void Button2_Click (objeto remetente, EventArgs e)
{
//nome de usuário
string sName = TextBox1.Text;
//Gerar chave
string sKey = sName + "_Login"
//Para conveniência do teste, este método é configurado para remover informações de login do Cache;
HttpContext.Current.Cache.Remove(sKey);
Label1.Text = Session["username"] + "As informações de login do usuário foram limpas do Cache!";
}
protegido void Timer1_Tick (remetente do objeto, EventArgs e)
{
if (Sessão["nome de usuário"]! = nulo)
{
//nome de usuário
string sName = TextBox1.Text;
//Gerar chave
string sKey = sName + "_Login"
//Obtém o valor da chave fornecida no cache
(
Cache[sKey]);
if (sUser! = nulo)
{
HttpContext.Current.Cache.Remove(sKey);
}
HttpContext.Current.Cache.Insert(
sChave,
sChave,
nulo,
DateTime.MaxValue,
SessTimeOut,
System.Web.Caching.CacheItemPriority.NotRemovable,
nulo
);
}
outro
{
this.Timer1.Enabled = falso;
}
}
}
Código de exemplo:/Files/heekui/WebLogin.rarPostscript
:
1 Este método é viável para julgar logins repetidos de usuários, mas também traz outro problema. Se o Timer estiver configurado para funcionar regularmente, a Sessão nunca expirará, desde que não feche normalmente ou feche o navegador. Isso terá algum efeito negativo?
2 Este método enviará solicitações regulares ao servidor para cada usuário, o que sem dúvida aumentará a carga do servidor. Se houver muitas pessoas online ao mesmo tempo, esse tipo de solicitação terá um grande impacto no servidor?
Portanto, só podemos dizer que o método acima é apenas um método viável, mas não há teste para saber se é ideal. Não sei se você tem alguma maneira melhor.
http://www.cnblogs.com/heekui/archive/2007/01/08/615254.html