Простое приращение счетчика в Asp. net Core - PullRequest
0 голосов
/ 05 мая 2020

В моем контроллере я хочу подсчитать количество неудачных попыток входа в систему.

else
{
     // Increment counter by 1
     // check if counter == 3
     // ban user
     logonAttempt++;
     if (logonAttempt >= MAX_LOGON_ATTEMPT)
     {
          ModelState.AddModelError("", "This account has been locked. Please contact the help desk for further support.");
     } else
     {
          ModelState.AddModelError("", "You have entered an invalid username or password.");
     }
}

Каждый раз, когда пользователь нажимает кнопку «отправить» и код входит в этот оператор else, logonAttempt сбрасывается до 0 .

Есть ли способ предотвратить его сброс? для пользовательской сессии?

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Возможно, вы сможете сделать это следующим образом:

// мой класс

private static XDic<DateTime, XDic<string, int>> daily_reg_attemps = new XDic<DateTime,XDic<string, int>>(); 
const int limit = 20;

    public bool is_banned(string key,HttpRequestMessage request)
    {
        //handle attempt monitoring
        var today = DateTime.Today.Date;
        if (!daily_reg_attemps.ContainsKey(today))
            daily_reg_attemps.Add(today, new XDic<string, int>());
        var reg_attemps = daily_reg_attemps[today];

        //handle attempts
        var ip = GetClientIp(request);
        if (!reg_attemps.ContainsKey(ip)) reg_attemps.Add(ip, 0);
        if (!reg_attemps.ContainsKey(key)) reg_attemps.Add(key, 0);

        //prevent localhost
        if (!request.RequestUri.Host.Contains("localhost"))
        {
            reg_attemps[ip]++;
            reg_attemps[key]++;
        }

        return (reg_attemps[ip] > limit || reg_attemps[key] > limit);
    }

// мой собственный словарь

public class XDic<TKey, TValue> : Dictionary<TKey, TValue>
{
   public virtual void Add(TKey key, TValue value, bool updateIfExist = true)
    {
        if (key == null)
        {
            throw new ArgumentException("Key parameter is Null.");
        }

        if (base.ContainsKey(key))
        {
            if (updateIfExist)
            {
                base[key] = value;
            }
            else {
                throw new ArgumentException("Error")
            }
        }
        else {
            base.Add(key, value);
        }
    }
0 голосов
/ 05 мая 2020

Я думаю, вы что-то неправильно понимаете. Вы можете рассчитывать в сеансе, но новые шаблоны архитектуры, как правило, работают меньше сеанса. Жизненный цикл должен быть таким: запросить, создать экземпляр чего-то действительно небольшого, ответить, а затем выпустить экземпляр, чтобы начать работу в облегченном режиме. вы используете для входа в систему. Мой совет - просто проверьте этот фреймворк, действительно гибкий, где все эти проблемы уже решены.

https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity?view=aspnetcore-3.1&tabs=visual-studio

...