Autoryzacja dla grupy ścieżek w controlerach

Autoryzacja dla grupy ścieżek w controlerach
KO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 463
0

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

Kopiuj
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.

AdamWox
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Jastrzębie-Zdrój
  • Postów: 2180
1

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

Kopiuj
[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" 🤔

jarzi
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 96
1

Możesz czegoś takiego spróbować:

Kopiuj
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? 😉

KO
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 463
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).

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.