Member 14636590 Ответов: 1

Как регулировать количество запросов на одного пользователя с помощью 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());
        }

1 Ответов

Рейтинг:
0

Andy Lanng

Взгляните на объект сеанса:

Введение в ASP.NET сеансы[^]

Исследуя сессию в ASP.NET[^]

Если вы не меняете конфигурацию сеанса, то каждый сеанс уникален для сеанса браузера пользователя. Это означает, что пользователь может иметь несколько сеансов, если он также входит в систему из другого браузера или браузера в режиме инкогнито или приватном режиме, но пользователи редко делают это.

Надеюсь, это поможет ^_^