Как я реализую ограничение уровня в сайте MVC ASP.NET?

Я создаю сайт MVC ASP.NET, где я хочу ограничить, как часто аутентифицируемые пользователи могут использовать некоторые функции сайта.

Хотя я понимаю, как ограничение уровня работает существенно, я не могу визуализировать, как реализовать его программно, не создавая главный запах кода.

Можно ли указать на меня к простому все же мощному решению для приближения к такой проблеме с примером кода C#?

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

12
задан Luke Girvin 7 July 2017 в 15:09
поделиться

2 ответа

Если вы используете IIS 7, вы можете взглянуть на Расширение динамических ограничений IP . Другой вариант - реализовать это как фильтр действий:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class RateLimitAttribute : ActionFilterAttribute
{
    public int Seconds { get; set; }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // Using the IP Address here as part of the key but you could modify
        // and use the username if you are going to limit only authenticated users
        // filterContext.HttpContext.User.Identity.Name
        var key = string.Format("{0}-{1}-{2}",
            filterContext.ActionDescriptor.ControllerDescriptor.ControllerName,
            filterContext.ActionDescriptor.ActionName,
            filterContext.HttpContext.Request.UserHostAddress
        );
        var allowExecute = false;

        if (HttpRuntime.Cache[key] == null)
        {
            HttpRuntime.Cache.Add(key,
                true,
                null,
                DateTime.Now.AddSeconds(Seconds),
                Cache.NoSlidingExpiration,
                CacheItemPriority.Low,
                null);
            allowExecute = true;
        }

        if (!allowExecute)
        {
            filterContext.Result = new ContentResult
            {
                Content = string.Format("You can call this every {0} seconds", Seconds)
            };
            filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.Conflict;
        }
    }
}

А затем украсить действие, которое необходимо ограничить:

[RateLimit(Seconds = 10)]
public ActionResult Index()
{
    return View();
}
18
ответ дан 2 December 2019 в 07:02
поделиться

Взгляните на ответ Джаррода о том, как они это делают на SO.

StackOverflow MVC Throttling

Некоторые примеры кода, а также объяснение того, как это работает.

4
ответ дан 2 December 2019 в 07:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: