229 votes

Meilleure façon de mettre en œuvre la demande de limitation dans ASP.NET MVC ?

Nous sommes à expérimenter avec différentes façons de limiter les actions de l'utilisateur dans une période de temps donnée:

  • Limite de question/réponse postes
  • Limite de modifications
  • Limite de nourrir les récupérations

Pour le moment, nous sommes en utilisant le Cache de simplement insérer un enregistrement de l'activité de l'utilisateur - si l'enregistrement existe si/lorsque l'utilisateur effectue la même activité, nous avons la manette des gaz.

En utilisant le Cache automatiquement nous donne des données obsolètes de nettoyage et de glissement de l'activité windows de utilisateurs, mais comment il pourrait être un problème.

Quelles sont les autres façons de s'assurer que les demandes/les actions de l'utilisateur peuvent être efficacement étranglé (accent mis sur la stabilité)?

259voto

Jarrod Dixon Points 9201

Voici une version générique de ce que nous avons été à l'aide sur un Débordement de Pile pour l'année écoulée:

/// <summary>
/// Decorates any MVC route that needs to have client requests limited by time.
/// </summary>
/// <remarks>
/// Uses the current System.Web.Caching.Cache to store each client request to the decorated route.
/// </remarks>
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class ThrottleAttribute : ActionFilterAttribute
{
    /// <summary>
    /// A unique name for this Throttle.
    /// </summary>
    /// <remarks>
    /// We'll be inserting a Cache record based on this name and client IP, e.g. "Name-192.168.0.1"
    /// </remarks>
    public string Name { get; set; }

    /// <summary>
    /// The number of seconds clients must wait before executing this decorated route again.
    /// </summary>
    public int Seconds { get; set; }

    /// <summary>
    /// A text message that will be sent to the client upon throttling.  You can include the token {n} to
    /// show this.Seconds in the message, e.g. "Wait {n} seconds before trying again".
    /// </summary>
    public string Message { get; set; }

    public override void OnActionExecuting(ActionExecutingContext c)
    {
        var key = string.Concat(Name, "-", c.HttpContext.Request.UserHostAddress);
        var allowExecute = false;

        if (HttpRuntime.Cache[key] == null)
        {
            HttpRuntime.Cache.Add(key,
                true, // is this the smallest data we can have?
                null, // no dependencies
                DateTime.Now.AddSeconds(Seconds), // absolute expiration
                Cache.NoSlidingExpiration,
                CacheItemPriority.Low,
                null); // no callback

            allowExecute = true;
        }

        if (!allowExecute)
        {
            if (String.IsNullOrEmpty(Message))
                Message = "You may only perform this action every {n} seconds.";

            c.Result = new ContentResult { Content = Message.Replace("{n}", Seconds.ToString()) };
            // see 409 - http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
            c.HttpContext.Response.StatusCode = (int)HttpStatusCode.Conflict;
        }
    }
}

Exemple d'utilisation:

[Throttle(Name="TestThrottle", Message = "You must wait {n} seconds before accessing this url again.", Seconds = 5)]
public ActionResult TestThrottle()
{
    return Content("TestThrottle executed");
}

L'ASP.NET Cache fonctionne comme un champion ici - en l'utilisant, vous obtenez automatiquement le nettoyage de votre manette des gaz entrées. Et avec l'augmentation de notre trafic, nous ne voyons pas que c'est un problème sur le serveur.

N'hésitez pas à donner des commentaires sur cette méthode; lorsque nous faisons de Débordement de Pile mieux, vous obtenez votre Ewok fixer encore plus vite :)

70voto

notandy Points 2268

Microsoft a une nouvelle extension pour IIS 7, appelée IP Dynamique des Restrictions Extension pour IIS 7.0 Bêta.

"La Dynamique des Restrictions IP pour IIS 7.0 est un module qui fournit une protection contre le déni de service et les attaques par force brute sur le serveur web et des sites web. Cette protection est assurée par bloquant temporairement les adresses IP des clients HTTP qui font un nombre inhabituellement élevé de demandes simultanées ou qui font un grand nombre de requêtes sur une petite période de temps." http://learn.iis.net/page.aspx/548/using-dynamic-ip-restrictions/

11voto

Rob Kraft Points 134

Nous utilisons la technique empruntée à cette URL http://www.codeproject.com/KB/aspnet/10ASPNetPerformance.aspx, ne pas pour la limitation, mais pour d’un pauvre homme déni de Service (D.O.S). C’est également axée sur le cache et peut être semblable à ce que vous faites. Vous êtes limitation pour empêcher les attaques D.O.S. ? Routeurs peuvent certainement être utilisés pour réduire le D.O.S ; ne pensez-vous pas qu’un routeur capable de traiter la limitation dont vous avez besoin ?

0voto

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X