Jaki jest najlepszy sposób na przekierowanie w pliku ActionFilterAttribute
. Mam ActionFilterAttribute
wezwanie IsAuthenticatedAttributeFilter
i sprawdziłem wartość zmiennej sesji. Jeśli zmienna ma wartość false, chcę, aby aplikacja przekierowała do strony logowania. Wolałbym przekierować przy użyciu nazwy trasy, SystemLogin
jednak w tym momencie każda metoda przekierowania byłaby w porządku.
c#
asp.net-mvc
asp.net-mvc-3
redirect
routes
ryanzec
źródło
źródło
Odpowiedzi:
Ustaw filterContext.Result
Z nazwą trasy:
Możesz też zrobić coś takiego:
Jeśli chcesz użyć
RedirectToAction
:Możesz utworzyć publiczną
RedirectToAction
metodę na swoim kontrolerze ( najlepiej na swoim kontrolerze podstawowym ), która po prostu wywoła chronionyRedirectToAction
przedSystem.Web.Mvc.Controller
. Dodanie tej metody pozwala na publiczne wywołanie TwojegoRedirectToAction
z filtra.Wtedy twój filtr wyglądałby mniej więcej tak:
źródło
protected
abyś nie miał do niego dostępu z poziomu filtra.protected
musi być jakieś rozsądne wyjaśnienie? Czuję się bardzo nieprzyjemnie definiując tę dostępnośćRedirectToAction
bez zrozumienia, dlaczego została ona zamknięta w pierwszej kolejności.Alternatywnie do przekierowania, jeśli wywołuje Twój własny kod, możesz użyć tego:
Nie jest to zwykłe przekierowanie, ale daje podobny wynik bez zbędnych kosztów ogólnych.
źródło
actionContext.Result.ExecuteResult
z poziomu swojego filtra akcji - MVC zrobi to automatycznie po uruchomieniu filtru akcji (pod warunkiem, żeactionContext.Result
nie jest null).Używam MVC4, zastosowałem następujące podejście do przekierowania niestandardowego ekranu html po naruszeniu autoryzacji.
Rozszerz
AuthorizeAttribute
powiedzCutomAuthorizer
zastąpienieOnAuthorization
iHandleUnauthorizedRequest
Zarejestruj
CustomAuthorizer
wRegisterGlobalFilters
.po zidentyfikowaniu
unAuthorized
wywołania dostępuHandleUnauthorizedRequest
i przekierowaniu do odpowiedniej akcji kontrolera, jak pokazano poniżej.źródło
Wygląda na to, że chcesz ponownie zaimplementować lub rozszerzyć
AuthorizeAttribute
. Jeśli tak, upewnij się, że dziedziczisz to, a nieActionFilterAttribute
, aby umożliwić ASP.NET MVC wykonanie większej ilości pracy za Ciebie.Ponadto chcesz się upewnić, że autoryzujesz się przed wykonaniem jakiejkolwiek rzeczywistej pracy w metodzie akcji - w przeciwnym razie jedyną różnicą między zalogowanym a niezalogowanym będzie to, jaką stronę zobaczysz po zakończeniu pracy.
Jest dobre pytanie z odpowiedzią zawierającą więcej szczegółów na SO.
źródło
Wypróbuj następujący fragment, powinien być całkiem jasny:
źródło
Oto rozwiązanie, które bierze również pod uwagę, jeśli używasz żądań Ajax.
źródło
To działa dla mnie (asp.net core 2.1)
źródło
możesz odziedziczyć kontroler, a następnie użyć go w filtrze akcji
wewnątrz klasy ActionFilterAttribute:
wewnątrz kontrolera podstawowego:
Cons. ma to na celu zmianę wszystkich kontrolerów na dziedziczenie z klasy „MyController”
źródło