[Security/Critical] Fast alle Controller haben kein [Authorize] #34

Closed
opened 2026-09-09 20:16:55 +00:00 by Aceless · 1 comment
Owner

Problem

Nur SpaceController traegt [Authorize]. Ohne Attribut sind ungeschuetzt:

  • RecipeController
  • RecipeImagesController
  • MealPlansController
  • MealPlanEntriesController
  • SpaceMembersController

Die Endpunkte rufen User.GetUserId() auf. Ohne Token wirft UserClaimsExtensions.GetUserId eine Exception, der Aufrufer bekommt 500 statt 401.

Auswirkung

  • Falscher Statuscode, die App kann abgelaufene Tokens nicht erkennen und nicht sauber neu anmelden.
  • Die Zugriffskontrolle haengt allein daran, dass jede Repository-Methode zufaellig noch einmal prueft. Eine vergessene Pruefung ist sofort ein offenes Datenleck.

Fix

Globale Fallback-Policy setzen und die oeffentlichen Endpunkte explizit freigeben:

builder.Services.AddAuthorization(options =>
{
    options.FallbackPolicy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();
});

AuthController.Login/Register und AppInfoController bekommen [AllowAnonymous].

## Problem Nur `SpaceController` traegt `[Authorize]`. Ohne Attribut sind ungeschuetzt: - `RecipeController` - `RecipeImagesController` - `MealPlansController` - `MealPlanEntriesController` - `SpaceMembersController` Die Endpunkte rufen `User.GetUserId()` auf. Ohne Token wirft `UserClaimsExtensions.GetUserId` eine `Exception`, der Aufrufer bekommt **500** statt **401**. ## Auswirkung - Falscher Statuscode, die App kann abgelaufene Tokens nicht erkennen und nicht sauber neu anmelden. - Die Zugriffskontrolle haengt allein daran, dass jede Repository-Methode zufaellig noch einmal prueft. Eine vergessene Pruefung ist sofort ein offenes Datenleck. ## Fix Globale Fallback-Policy setzen und die oeffentlichen Endpunkte explizit freigeben: ```csharp builder.Services.AddAuthorization(options => { options.FallbackPolicy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build(); }); ``` `AuthController.Login/Register` und `AppInfoController` bekommen `[AllowAnonymous]`.
Author
Owner

Erledigt.

Statt einzelner Attribute gibt es jetzt eine globale Fallback-Policy in Program.cs:

builder.Services.AddAuthorization(options =>
{
    options.FallbackPolicy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();
});

Jeder Endpunkt ohne eigenes Attribut verlangt damit ein gültiges Token. Bewusst offen sind nur POST /api/auth/login, POST /api/auth/register, der AppInfoController und /health.

GetUserId() wirft außerdem keine nackte Exception mehr, sondern eine typisierte, die auf 401 abgebildet wird.

Geprüft: Aufrufe ohne Token auf /api/spaces und /api/spaces/{id}/recipes liefern jetzt 401 statt 500.


Branch backend/issue-fixes, Commits 2a1cc95.

Erledigt. Statt einzelner Attribute gibt es jetzt eine globale Fallback-Policy in `Program.cs`: ```csharp builder.Services.AddAuthorization(options => { options.FallbackPolicy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build(); }); ``` Jeder Endpunkt ohne eigenes Attribut verlangt damit ein gültiges Token. Bewusst offen sind nur `POST /api/auth/login`, `POST /api/auth/register`, der `AppInfoController` und `/health`. `GetUserId()` wirft außerdem keine nackte `Exception` mehr, sondern eine typisierte, die auf 401 abgebildet wird. **Geprüft:** Aufrufe ohne Token auf `/api/spaces` und `/api/spaces/{id}/recipes` liefern jetzt 401 statt 500. --- Branch `backend/issue-fixes`, Commits 2a1cc95.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
Aceless/RecipePlanner#34
No description provided.