Как регулировать количество запросов на одного пользователя с помощью ASP.NET веб-формы
мой Html-код
<asp:TextBox ID="Txtcomments" runat="server" TextMode="MultiLine"></asp:TextBox> <br /> <asp:Button ID="BtnPost" runat="server" Text="Post" OnClick="BtnPost_Click" /> <br /> <asp:Label ID="Label1" runat="server" Text=""></asp:Label>
моя проблема в том, что у меня есть пример веб-формы, такой как эта, если пользователь делает комментарий, он будет сохранен в базе данных, но мне пришлось ограничить конкретного пользователя таким образом, что он должен сделать только 2 комментария(запроса) в течение 5 минут времени, если тот же пользователь хочет сделать 3-й комментарий, он должен отображать сообщение
Что я уже пробовал:
я пробовал так сначала я думал, что должен ограничить пользователя с помощью ip-адреса, поэтому я сделал это проблема с этим здесь он ограничивает всех пользователей этого хоста, а не одного пользователя я хочу ограничить количество запросов от конкретного пользователя(скажем, конкретного компьютера или ноутбука) Пожалуйста, помогите мне в этом, каким образом я могу этого достичь
protected void BtnPost_Click(object sender, EventArgs e) { string ipaddress; ipaddress = Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; if (ipaddress == "" || ipaddress == null) ipaddress = Request.ServerVariables["REMOTE_ADDR"]; string SessionID = Session.SessionID; //Throttler is the new class i have written seperately var Throttle = new Throttler(); if (Throttle.RequestShouldBeThrottled(ipaddress)) { Label1.Text = "Access Denied because of Too Many requests"; TimeSpan span = (Convert.ToDateTime(Throttler.NextAccessDate) - Convert.ToDateTime(DateTime.Now)); string diff= String.Format("{0} minutes, {1} seconds", span.Minutes, span.Seconds); Label4.Text = "Elapsed Time = "+" "+"Try Again After "+diff; } else { SqlConnection con = new SqlConnection("Server=DELL-PC; User Id=sa;Password=123;Database=comments"); con.Open(); SqlCommand cmd = new SqlCommand("insert into tbl_comments(comment, ipAddress, Date)values(@p1, @p2, @p4)", con); cmd.Parameters.AddWithValue("@p1", Txtcomments.Text); cmd.Parameters.AddWithValue("@p2", ipaddress); date = DateTime.Now.ToString(); cmd.Parameters.AddWithValue("@p4", date); int i = cmd.ExecuteNonQuery(); if (i > 0) { Label1.Text = "Your comment has been posted successfully"; Label4.Text = " " ; } con.Close(); } } this is my Throttler class public class Throttler { private int _requestLimit; private int _timeoutInSeconds; private string _key; public static string NextAccessDate; public bool RequestShouldBeThrottled(string key, int requestLimit = 5, int timeoutInSeconds = 180) { _requestLimit = requestLimit; _timeoutInSeconds = timeoutInSeconds; _key = key; ThrottleInfo throttleInfo = (ThrottleInfo)HttpRuntime.Cache[_key]; if (throttleInfo == null) { throttleInfo = new ThrottleInfo { ExpiresAt = DateTime.Now.AddSeconds(_timeoutInSeconds), RequestCount = 0, }; NextAccessDate=throttleInfo.ExpiresAt.ToString(); } throttleInfo.RequestCount++; HttpRuntime.Cache.Add(_key, throttleInfo, null, throttleInfo.ExpiresAt, Cache.NoSlidingExpiration, CacheItemPriority.Normal, null); return (throttleInfo.RequestCount > _requestLimit); } } this is my ThrottleInfo class public class ThrottleInfo { public DateTime ExpiresAt { get; set; } public int RequestCount { get; set; } }
я изменил свой исходный код и попытался использовать файлы cookie таким образом, чтобы я мог ограничить конкретного пользователя до некоторой степени, если он делает запрос от этого конкретного Боузера(скажем, Google), это ограничение, но проблема в том, что мы знаем, что файлы cookie зависят от браузера тот же человек отправляет запросы из другого браузера (скажем, firefox), как я могу ограничить пользователя, чтобы сделать это .
вот исходный код, который я изменил по сравнению с вышеизложенным
protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { ipaddress = Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; if (ipaddress == "" || ipaddress == null&&(Request.Cookies["Appcookie"]==null)) { ipaddress = Request.ServerVariables["REMOTE_ADDR"]; strSessionID = HttpContext.Current.Session.SessionID; HttpCookie httpCookie = new HttpCookie("Appcookie"); UID = GetUniqueID(); Response.Cookies["Appcookie"].Value = UID; httpCookie.Expires = DateTime.Now.AddDays(1); } } } private static Random random = new Random(); private string GetUniqueID() { const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; return new string(Enumerable.Repeat(chars,10) .Select(s => s[random.Next(s.Length)]).ToArray()); }