Mam aplikacji ASP.NET MVC z kontrolerem, który wygląda mniej więcej tak:ASP.NET MVC Controller Konstruktor wezwany przed uwierzytelnianiem
[Authorize]
public class MyController : Controller
{
IMyRepository myRepository;
public MyController(IMyRepository myRepository)
{
this.myRepository = myRepository;
}
...
}
Zauważyłem, że konstruktor zostanie wywołany przed uwierzytelnieniu użytkownika, więc jeśli odwiedzasz stronę po raz pierwszy, przed wywołaniem przekierowania do ekranu logowania zostanie wywołany konstruktor. Istnieje wiele problemów z tym związanych, strona logowania ładuje się wolniej, witryna jest bardziej narażona na ataki DOS i jestem trochę zaniepokojony nieuwierzytelnionymi, nieautoryzowanymi użytkownikami, którzy mogą wywołać kod "za ścianą".
Mogę sprawdzić nadchodzące żądanie w konstruktorze i kaucję, chyba że użytkownik jest uprawniony, ale używam IOC (Windsor), co sprawia, że nieco trudne, moje repozytorium zostanie zainicjowane niezależnie od tego, czy I przechowuj instancję, więc pozostawię sprawdzanie uwierzytelnienia w każdym konstruktorze repozytorium. Czy istnieje prosty sposób uzyskania .NET MVC do uwierzytelnienia użytkownika przed w celu wywołania konstruktora? Myślę o dodaniu do kontrolera [PrincipalPermission(SecurityAction.Demand, Authenticated = true)]
, ale może być jeszcze lepszy sposób.
EDIT:
Ok, nie jest zbyt szczęśliwy z tego powodu, ale przedstawienie musi trwać teraz. Nie mogę opóźnić inicjowania repozytorium do czasu późniejszego z poziomu kontrolera. Kiedy twój kontroler używa IOC, tak jak w moim przykładzie, otrzymujesz już zainicjowaną implementację interfejsu repozytorium w momencie utworzenia kontrolera. Gdybym miał kontrolę nad tworzonym repozytorium, mógłbym łatwo wywołać IsAuthenticated, bez potrzeby stosowania nowej metody. Aby przejąć kontrolę nad inicjalizacją repozytorium, musiałbyś zaimplementować jakąś leniwą/późną inicjalizację w samym repozytorium w każdej implementacji. Nie podoba mi się to rozwiązanie, ponieważ powoduje niepotrzebną złożoność i, co ważniejsze, sprzężenie między kontrolerem a repozytorium. Implementacje repozytorium mogą być używane w innych kontekstach, w których inicjalizacja lenna nie ma sensu IMHO.
Pod warunkiem, że Twój konstruktor implementacji IMyRepository był lekki, nie widzę tu poważnego problemu (np. Jeśli jest to kosztowny proces konfiguracji rzeczywistego połączenia z twoim zapleczem, to zrób to leniwie, tzn. Po pierwszym odczytaniu/zapisaniu). Nie jesteś już tak wyeksponowany na stronie logowania, ponieważ to również tworzy instancję kontrolera i prawdopodobnie uzyskuje dostęp do magazynu pomocniczego w celu zweryfikowania poświadczeń. – Lazarus
@Lazarus Ale co, jeśli zależność od mojego kontrolera wymaga dostępu do niezerowej nazwy użytkownika (to znaczy, że użytkownik musi być uwierzytelniony w tym momencie). Obecnie używam do tego instancji 'Lazy', ale nienawidzę tego. Wydaje mi się, że byłoby zbyt wiele sensu, aby uwierzytelnić użytkownika przed dotarciem do kontrolera. –
julealgon