В моей предыдущей статье «Использование кеша для проверки повторного входа пользователей в систему» после практики и размышлений я обнаружил, что упустил очень важный момент: только установка значения входа в кеш при входе в систему. Если срок действия кэша установлен на длительное время, как только пользователь выйдет из системы и снова войдет в систему в течение короткого интервала времени, он обнаружит, что не может войти в систему. Однако если срок действия установлен на короткое время, злоумышленник снова войдет в систему через более короткий период времени и успешно пройдет тест. Очевидно, что этот метод суждения несовершенен.
Как нам нужно решить эту проблему времени? Установите короткий интервал срока действия, а затем регулярно проверяйте Кэш и перезаписывайте в Кэш информацию для входа пользователя. Поэтому до тех пор, пока пользователь не выйдет из системы веб-сайта и не закроет браузер, этот метод оценки всегда будет эффективным! Итак, в Интернете и под ASP.NET, что может удобно достичь эффекта таймера? На данный момент лучшим выбором, несомненно, является элемент управления «Таймер» в ATLAS! Вы можете установить начало таймера, время интервала и события, которые необходимо выполнить после интервала времени.
После улучшения программы она будет распространяться следующим образом (см. примечания к программе):
Главная страница
<%@ 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="сервер">
<title>Страница без названия</title>
</голова>
<тело>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<дел>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<СодержимоеШаблон>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Вход" />
<br />
<br />
<asp:Label ID="Label1" runat="server" Width="350px"></asp:Label>
<asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="Очистить кэш" />
<asp:Timer ID="Timer1" runat="server" Enabled="False" Interval="15000" OnTick="Timer1_Tick">
</asp:Таймер>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</форма>
</тело>
</html>
Фоновая программа,
использующая систему;
использование System.Data;
использование System.Configuration;
использование System.Web;
использование System.Web.Security;
использование System.Web.UI;
использование System.Web.UI.WebControls;
использование System.Web.UI.WebControls.WebParts;
использование System.Web.UI.HtmlControls
общедоступного частичного класса _Default: System.Web.UI.Page;
{
protected void Page_Load (отправитель объекта, EventArgs e)
{
}
protected void Button1_Click (отправитель объекта, EventArgs e)
{
пытаться
{
//имя пользователя
строка sName = TextBox1.Text
//Сгенерировать ключ;
строка sKey = sName + «_Login»;
//Получаем значение данного ключа в кеше
string sUser = Convert.ToString(Cache[sKey]);
//Проверяем, существует ли он
if (sUser == null || sUser == String.Empty)
{
Session["username"] = sName;
//В кэше нет элемента для этого ключа, что указывает на то, что пользователь не вошел в систему или время входа в систему истекло.
//TimeSpan представляет временной интервал и получает значение системной настройки для тайм-аута сеанса.
//(Если вы считаете, что время, отведенное пользователям на повторный вход в систему, меньше таймаута сеанса, это значение можно установить меньше)
//TimeSpan SessTimeOut = новый TimeSpan(0, 0, System.Web.HttpContext.Current.Session.Timeout, 0, 0);
//Для демонстрации здесь интервал сохранения кэша установлен на 20 секунд.
TimeSpan SessTimeOut = новый TimeSpan (0, 0, 0, 20, 0);
HttpContext.Current.Cache.Insert(
сКей,
сКей,
нулевой,
ДатаВремя.МаксЗначение,
SessTimeOut,
System.Web.Caching.CacheItemPriority.NotRemovable,
нулевой
);
//Запускаем таймер
this.Timer1.Enabled = true;
//Когда вы входите в систему в первый раз, вы можете выполнять ту работу, которую хотите.
Label1.Text = "Привет!" + sName + "Добро пожаловать";
}
еще
{
//В Кэше найдена запись пользователя, свидетельствующая о том, что он уже авторизовался и ему запрещено авторизоваться повторно.
Label1.Text = "К сожалению, вход под вашими данными выполнен";
возвращаться;
}
}
улов (System.Exception ex)
{
Метка1.Текст = ex.Сообщение;
}
}
protected void Button2_Click (отправитель объекта, EventArgs e)
{
//имя пользователя
строка sName = TextBox1.Text
//Сгенерировать ключ;
string sKey = sName + "_Login"
//Для удобства тестирования этот метод настроен на удаление данных для входа из Кэша
HttpContext.Current.Cache.Remove(sKey);
Label1.Text = Session["username"] + "Информация для входа пользователя удалена из кэша!";
}
protected void Timer1_Tick (отправитель объекта, EventArgs e)
{
if (Session["username"] != null)
{
//имя пользователя
строка sName = TextBox1.Text
//Сгенерировать ключ;
string sKey = sName + "_Login"
//Получаем значение данного ключа в кеше
строка sUser = Convert.ToString(Cache[sKey]);
TimeSpan SessTimeOut = new TimeSpan(0, 0, 0, 20, 0);
если (sUser != ноль)
{
HttpContext.Current.Cache.Remove(sKey);
}
HttpContext.Current.Cache.Insert(
сКей,
сКей,
нулевой,
ДатаВремя.МаксЗначение,
SessTimeOut,
System.Web.Caching.CacheItemPriority.NotRemovable,
нулевой
);
}
еще
{
this.Timer1.Enabled = ложь;
}
}
}
Пример кода:/Files/heekui/WebLogin.rarPostscript
:
1 Этот метод пригоден для оценки повторных входов пользователей в систему, но он также сопровождается другой проблемой. Если таймер настроен на регулярную работу, сеанс никогда не истечет, пока он не завершится обычным образом или не закроет браузер. Будет ли это иметь какие-либо негативные последствия?
2 Этот метод будет регулярно отправлять запросы на сервер для каждого пользователя, что, несомненно, увеличит нагрузку на сервер. Если в сети одновременно находится много людей, окажет ли такой запрос большое влияние на сервер?
Поэтому мы можем только сказать, что описанный выше метод является лишь допустимым, но не существует проверки его оптимальности. Я не знаю, есть ли у вас лучший способ.
http://www.cnblogs.com/heekui/archive/2007/01/08/615254.html