Git Product home page Git Product logo

Comments (6)

stefanprodan avatar stefanprodan commented on May 1, 2024

I've implemented this 3 years ago for ASP.NET Web API, you can see the docs here.

Attribute-based rate limiting has a down side: action filters are executed after the middlewares. If you are using OAuth or any other type of authorization, the rate limit will happen after the auth logic, making the whole point of IP rate limiting useless. I agree that is easier to apply the limits using attributes and if you only want to rate limit based on client id then you probably don't care that the limiting is done after the middleware stack is executed. I will consider adding this in a future release.

from aspnetcoreratelimit.

kspearrin avatar kspearrin commented on May 1, 2024

I didn't think about the fact that the current middleware approach comes before action filters, however, like you mentioned this would still work fine for client based rate limiting. Thanks for giving it a consideration.

from aspnetcoreratelimit.

stefanprodan avatar stefanprodan commented on May 1, 2024

Even for client based rate limiting the attribute usage is very limited. If you have different limits for each subscription (like most API products have) then you can't use the attribute because the rate limit values are stored in the database and you clearly don't want to hardcode those in your code inside the attribute declaration. I think attribute-based rate limiting works only for public APIs that are applying the same limits to all their users, like Twitter does.

from aspnetcoreratelimit.

kspearrin avatar kspearrin commented on May 1, 2024

You don't always have to query the database to get information like that. For example, JWT tokens could hold information about the client's rate limits.

from aspnetcoreratelimit.

stefanprodan avatar stefanprodan commented on May 1, 2024

My approach is to store the client limits in cache (local or distributed). If it's local cache, then at app startup I load the rate limits from db in cache, then I can update the cache if a client gets removed or added while the app is running. If the app needs scaling, then I use Redis to store the limits so no matter the app instance a clients ends up on, the limit is applied. The JWT token approach will not work if your app has more then one instance because the load balancer in front of your app will forward a client to different instances based on the load. To rate limit a client that can call multiple app nodes in parallel, you need a mechanism to create a distributed lock and increment the rate limit counter atomically.

from aspnetcoreratelimit.

kspearrin avatar kspearrin commented on May 1, 2024

I think we misunderstood each other. I was referring to the JWT token holding what the client's rate limit policies are (as opposed to having to query the DB for this information), not their counter. Having looked further into how client rate limiting works in this library though (I've just been using IP rate limiting for my current implementation), I don't think that is even supported by the library. It seems that client policies are also hard coded into settings.

Update: Nevermind. It seems you can:

https://github.com/stefanprodan/AspNetCoreRateLimit/wiki/ClientRateLimitMiddleware#update-rate-limits-at-runtime

I think I am overthinking this a bit and we're getting a bit off topic. I'll go ahead and close this issue for now since it seems there are many reasons at play as to why it can't be easily supported. Thanks!

from aspnetcoreratelimit.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.