Finishes functional design for unit 0 (back-end changes before front-end work)
This commit is contained in:
+105
@@ -0,0 +1,105 @@
|
||||
# Tech Stack Decisions — Unit 0: Backend Prerequisites
|
||||
|
||||
## Existing Stack (no changes)
|
||||
All existing technology choices are retained:
|
||||
- **.NET 10 / ASP.NET Core 10** — Web API framework
|
||||
- **Entity Framework Core 10** — ORM + migrations
|
||||
- **ASP.NET Core Identity** — User/role management, password hashing
|
||||
- **SQL Server** — Primary database
|
||||
|
||||
---
|
||||
|
||||
## New/Updated: Rate Limiting
|
||||
|
||||
| Decision | Choice | Rationale |
|
||||
|----------|--------|-----------|
|
||||
| Rate limiter | ASP.NET Core built-in `RateLimiter` (Microsoft.AspNetCore.RateLimiting) | No extra NuGet package needed — available in .NET 7+; production-ready |
|
||||
| Login policy | Fixed window (5 req / 1 min / IP) | Predictable; blocks brute-force login attempts |
|
||||
| Refresh policy | Sliding window (20 req / 1 min / IP) | More lenient for token rotation; prevents abuse |
|
||||
| Configuration | `appsettings.json → RateLimiting` | Configurable without code recompile |
|
||||
|
||||
---
|
||||
|
||||
## New/Updated: CORS
|
||||
|
||||
| Decision | Choice | Rationale |
|
||||
|----------|--------|-----------|
|
||||
| CORS implementation | ASP.NET Core built-in CORS middleware | No extra NuGet package; part of framework |
|
||||
| Origins configuration | `appsettings.json → Cors:AllowedOrigins[]` | Environment-specific; follows dotnet-appsettings pattern |
|
||||
| Credential support | `AllowCredentials()` | Required for httpOnly cookie to be sent cross-origin |
|
||||
| Methods | `AllowAnyMethod()` | Avoids future CORS issues when new endpoints are added |
|
||||
| Headers | `AllowAnyHeader()` | Standard approach; avoids pre-flight failures for custom headers |
|
||||
|
||||
---
|
||||
|
||||
## New/Updated: httpOnly Cookie
|
||||
|
||||
| Decision | Choice | Rationale |
|
||||
|----------|--------|-----------|
|
||||
| Cookie implementation | ASP.NET Core `Response.Cookies.Append()` | Built-in, no extra library |
|
||||
| Token read | `Request.Cookies["refreshToken"]` | Standard ASP.NET Core cookie reading |
|
||||
| Secure flag | `request.IsHttps` | Adapts to environment; safe in production, usable in local HTTP dev |
|
||||
| SameSite | `Strict` | Maximum CSRF protection |
|
||||
|
||||
---
|
||||
|
||||
## New/Updated: Error Responses
|
||||
|
||||
| Decision | Choice | Rationale |
|
||||
|----------|--------|-----------|
|
||||
| Error format | RFC 9457 ProblemDetails | .NET standard; consistent with ASP.NET Core defaults; interoperable |
|
||||
| Implementation | `Microsoft.AspNetCore.Mvc.ProblemDetails` (built-in) | No extra NuGet package needed |
|
||||
| Global handler | Existing `GlobalExceptionHandler` extended | Avoids duplication; centralises error formatting |
|
||||
|
||||
---
|
||||
|
||||
## appsettings.json Additions
|
||||
|
||||
Following the dotnet-appsettings skill pattern:
|
||||
|
||||
```json
|
||||
// appsettings.json (production defaults — no real values)
|
||||
{
|
||||
"Cors": {
|
||||
"AllowedOrigins": []
|
||||
},
|
||||
"RateLimiting": {
|
||||
"Login": {
|
||||
"PermitLimit": 5,
|
||||
"WindowSeconds": 60
|
||||
},
|
||||
"Refresh": {
|
||||
"PermitLimit": 20,
|
||||
"WindowSeconds": 60
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
```json
|
||||
// appsettings.Development.json (complete reference for developers)
|
||||
{
|
||||
"Cors": {
|
||||
"AllowedOrigins": ["http://localhost:5173"]
|
||||
},
|
||||
"RateLimiting": {
|
||||
"Login": {
|
||||
"PermitLimit": 5,
|
||||
"WindowSeconds": 60
|
||||
},
|
||||
"Refresh": {
|
||||
"PermitLimit": 20,
|
||||
"WindowSeconds": 60
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
```json
|
||||
// appsettings.local.json (developer override — gitignored)
|
||||
{
|
||||
"Cors": {
|
||||
"AllowedOrigins": ["http://localhost:5173"]
|
||||
}
|
||||
}
|
||||
```
|
||||
Reference in New Issue
Block a user