Skip to content

IDN-05: rate limiting za prijavu i reset lozinke po IP adresi - #28

Merged
owlCoder merged 7 commits into
mainfrom
feature/IDN-05-rate-limiting
Nov 3, 2026
Merged

owlCoder merged 7 commits into
mainfrom
feature/IDN-05-rate-limiting

Conversation

@nemanjavuksa

@nemanjavuksa nemanjavuksa commented Nov 1, 2026 •

Copy link
Copy Markdown
Collaborator

Component and requirement IDs

  • Component: IDN-05 – ograničenje broja pokušaja prijave (rate limiting)
  • Requirements: IDN-05 (J). Usklađeno sa ADM-04, AUD-03, AUD-04 (ne implementira ih, već ih poštuje); zavisi od IDN-02 i IDN-04.
  • Author(s): Nemanja Vuksa (PR12/2023), TIM04

Changes

  • IP rate limiter za prijavu i reset lozinke: imenovane politike RateLimitPolicies.Login i PasswordReset (sliding window, IPv6 grupisan po /64).
  • 429 Too Many Requests sa Retry-After, X-Correlation-ID (HttpContext.TraceIdentifier) i generičkim telom rate_limited koje ne otkriva postojanje naloga.
  • ForwardedHeaders: X-Forwarded-For se prihvata samo od proxy-ja iz KnownProxies/KnownNetworks (ForwardLimit = 1); bez podešenog proxy-ja header se ignoriše.
  • Pragovi kroz okruženje (RateLimiting__*), podrazumevano 30/min (login) i 10/15 min (reset), sa validacijom pri startu.
  • Program.cs: 3 linije (AddIdentityRateLimiting, UseIdentityRateLimiting). UseIdentityRateLimiting uključuje UseForwardedHeaders i UseRouting za celu aplikaciju.
  • backend/SecurityLab.slnx namerno nije uključen (uklonjen revert-om PR ACC-04 / ACC-08: KT1 implementacija, bezbednosni model i negativni testovi #20; testovi rade i bez njega).

Verification

dotnet test backend/Platform.Identity.Tests

Lokalno 24/24 testa prolazi (1. 11. 2026). Trenutni CI samo builduje API; testovi ulaze u CI kada se zajednički Platform.Tests (IDN-02) spoji u main.

Architecture and data flow

docs/components/identity/IDN-05.md: dijagram arhitekture i DFD sa tri granice poverenja (Internet → reverse proxy → API). Planirani ILoginAttemptLimiter je na dijagramima označen isprekidano.

Security checks and negative tests

  • Prekoračenje limita → 429 + Retry-After (RequestsAboveLimitGet429WithRetryAfter)
  • Lažni X-Forwarded-For se ignoriše (SpoofedForwardedForFromUntrustedSourceIsIgnored, ForwardedForFromUnlistedProxyIsIgnored, ClientCannotPrependFakeAddressBehindTrustedProxy)
  • Odgovor ne otkriva nalog (RejectionBodyIsGenericAndStable)
  • Email i lozinka se ne pojavljuju u logovima (RejectionIsLoggedWithCorrelationIdButWithoutCredentials)
  • Rotacija IPv6 adresa unutar /64 ne zaobilazi limit (Ipv6AddressesInSameSlash64ShareLimit)
  • Neispravna konfiguracija zaustavlja start (InvalidConfigurationStopsStartup, ApiRefusesToStartWithInvalidLimit)

Kompletna tabela pretnja–kontrola–test–dokaz i scenariji po 8.1 su u IDN-05.md.

Dependencies

  • IDN-02 (login): na akciju LoginController.Login dodati [EnableRateLimiting(RateLimitPolicies.Login)]; poziv budućeg ILoginAttemptLimiter iz LoginAccount.
  • IDN-04 (reset lozinke): [EnableRateLimiting(RateLimitPolicies.PasswordReset)] na endpointu za reset.
  • Sledeći PR: brojanje neuspešnih prijava po nalogu (ILoginAttemptLimiter).

- Imenovane politike RateLimitPolicies.Login i PasswordReset (sliding window,
  po IP-u; IPv6 grupisan po /64); podrazumevano 30/min (login) i 10/15min
  (reset), podesivo kroz okruzenje (ADM-04) uz validaciju pri startu
- 429 Too Many Requests sa Retry-After, X-Correlation-ID (TraceIdentifier)
  i generickim telom rate_limited koje ne otkriva postojanje naloga
- ForwardedHeaders prihvata X-Forwarded-For samo od proxy-ja iz KnownProxies/
  KnownNetworks (ForwardLimit = 1); bez podesenog proxy-ja header se ignorise
- Platform.Identity.Tests: 24 testa (limit, lazni XFF, poverljivi proxy, IPv6,
  MVC kontroler, logovi bez kredencijala, konfiguracija)
- docs/components/identity/IDN-05.md: arhitektura, DFD, pretnje i test scenariji
@nemanjavuksa
nemanjavuksa requested a review from owlCoder November 1, 2026 16:33

owlCoder commented Nov 2, 2026

Copy link
Copy Markdown
Owner

Pregled: IDN-05 je dodeljen timu 4, kome pripada autor. U opisu pogrešno stoji TIM05 — ispraviti oznaku na Tim 4. Glavni CI prolazi, ali posebni Platform.Identity.Tests nisu uključeni u prijavljeni workflow; molimo dodajte njihov dotnet test korak u GitHub Actions i dostavite zelen rezultat pre merge-a.

@nemanjavuksa

Copy link
Copy Markdown
Collaborator Author

Ispravljeno:

  • Oznaka tima je Tim 4 (opis PR-a i docs/components/identity/IDN-05.md).
  • Dodat CI korak "Test IDN-05 rate limiting" (dotnet test backend/Platform.Identity.Tests); CI je zelen (24/24).
  • Grana je usklađena sa main (merge posle PR Feature/idn 03 account status #33).

owlCoder commented Nov 3, 2026

Copy link
Copy Markdown
Owner

Ponovni pregled (03.11): ispravljena oznaka TIM04 i GitHub Actions backend solution testovi su zeleni. Vlasništvo IDN-05 (tim 4) je potvrđeno. PR trenutno ima merge konflikte sa novim main nakon integracije drugih timova. Molimo rešiti konflikte i ponoviti CI na ažuriranoj grani; nakon toga može na merge.

… u Platform.RateLimiting.Tests zbog sudara imena
@nemanjavuksa

Copy link
Copy Markdown
Collaborator Author

Konflikti sa main su rešeni (merge posle PR #40, #42, #46) i CI je ponovo zelen.

@owlCoder
owlCoder merged commit 35fe01f into main Nov 3, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants