Autoryzacja dla grupy ścieżek w controlerach

0

Cześć,
w MinimalApi możemy zrobić takie coś:

app.MapGroup("/api/auth").RequireAuthorization();

Czyli jeśli dobrze rozumiem jest to odpowiednik utworzenia filtra [Authorize] w akcji Controlera.

A moje pytanie jest takie: czy można w jakiś prosty sposób wymusić analogiczne działanie, ale dla akcji w controllerach dla wszystkich ścieżek, które zaczynają się od /api/auth/' w taki sposób, aby nie musieć dodawać za każdym razem filtra [Authorize]?
Czyli jeśli ścieżka zaczyna się od 'api/auth/' to powinna odbyć się autentykacja i autoryzacja - niezależnie czy jest ustawiony filtr [Authorize] czy nie.

Rozwiązaniem może być middleware, ale zastanawiam się czy nie da się tego zrobić z poziomu konfiguracji programu - tak jak w minial api.

1

[Authorize] możesz dopisać do całego kontrolera, a nie do konkretnej akcji/endpointu.

[Authorize]
public class AuthController : Controller
{
}

PS.
Jeśli to tylko przykład to ok, ale jeśli nie, to kontroler do autoryzacji nie powinien mieć atrybutu [Authorize], bo się nigdy nie "zalogujesz" 🤔

1

Możesz czegoś takiego spróbować:

app.Use(async (context, next) =>
{
    if (context.Request.Path.StartsWithSegments("/api/auth"))
    {
        if (!context.User.Identity.IsAuthenticated)
        {
            context.Response.Redirect("/url");
            return;
        }
    }

    await next.Invoke();
});

Nie jest chyba to zbyt eleganckie, dobrze by było jakbyś podał przypadek użycia.

I jak wyżej @AdamWox napisał, też się zastanawiam czy endpoint pod którym się logujesz powinien być tylko dla zalogowanych? 😉

0

@AdamWox dzięki za Twój udział w wątkach na forum, ale standardowo nie odpowiadasz na zadane pytanie. Tak, wiem, że atrybut [Authorize] mogę ustawić na całą klasę, ale to nie ma nic do mojego pytania i problemu. Co do controllera do autoryzacji to on może mieć ustawiony atrybut [Authorize], ale akcja do logowania powinna mieć wówczas ustawiony atrybut [AllowAnonymous].

@jarzi dzięki. Myślałem, że da się to zrobić analogicznie jak w minimal api, ale to rozwiązanie również jest wystarczające i tak mniej więcej właśnie to zrobiłem (tylko przez klasę, bo stwierdziłem, że troszkę bardziej rozbuduję te warunki).

1 użytkowników online, w tym zalogowanych: 0, gości: 1