Was ist der beste Weg, um eine Weiterleitung in einem ActionFilterAttribute
. Ich habe einen ActionFilterAttribute
Aufruf IsAuthenticatedAttributeFilter
und das hat den Wert einer Sitzungsvariablen überprüft. Wenn die Variable false ist, soll die Anwendung zur Anmeldeseite umleiten. Ich würde es vorziehen, mit dem Routennamen umzuleiten, SystemLogin
aber jede Umleitungsmethode an dieser Stelle wäre in Ordnung.
c#
asp.net-mvc
asp.net-mvc-3
redirect
routes
Ryanzec
quelle
quelle
Antworten:
Setzen Sie filterContext.Result
Mit dem Routennamen:
Sie können auch Folgendes tun:
Wenn Sie verwenden möchten
RedirectToAction
:Sie können
RedirectToAction
auf Ihrem Controller ( vorzugsweise auf seinem Basis-Controller ) eine öffentliche Methode erstellen , die einfach den geschütztenRedirectToAction
von aufruftSystem.Web.Mvc.Controller
. Durch Hinzufügen dieser Methode können SieRedirectToAction
vom Filter aus einen öffentlichen Aufruf an Sie senden.Dann würde Ihr Filter ungefähr so aussehen:
quelle
protected
dass Sie nicht über den Filter darauf zugreifen können.protected
zu erstellen. Es muss eine vernünftige Erklärung geben. Ich fühle mich sehr schmutzig, diese Zugänglichkeit neu zu definieren,RedirectToAction
ohne zu verstehen, warum sie überhaupt gekapselt wurde.Alternativ zu einer Umleitung können Sie Folgendes verwenden, wenn Sie Ihren eigenen Code aufrufen:
Es handelt sich nicht um eine reine Weiterleitung, sondern um ein ähnliches Ergebnis ohne unnötigen Overhead.
quelle
actionContext.Result.ExecuteResult
innerhalb Ihres Aktionsfilters aufrufen sollten - MVC führt dies automatisch aus, nachdem der Aktionsfilter ausgeführt wurde (vorausgesetzt, eractionContext.Result
ist nicht null).Ich verwende MVC4 und habe den folgenden Ansatz verwendet, um einen benutzerdefinierten HTML-Bildschirm bei einem Verstoß gegen die Autorisierung umzuleiten.
Erweitern Sie
AuthorizeAttribute
sayCutomAuthorizer
überschreiben Sie dasOnAuthorization
undHandleUnauthorizedRequest
Registrieren Sie die
CustomAuthorizer
in derRegisterGlobalFilters
.nach Identifizierung des
unAuthorized
ZugriffsaufrufsHandleUnauthorizedRequest
und Weiterleitung an die betreffende Controller-Aktion wie unten gezeigt.quelle
Es hört sich so an, als ob Sie neu implementieren oder möglicherweise erweitern möchten
AuthorizeAttribute
. In diesem Fall sollten Sie sicherstellen, dass Sie dies erben und nichtActionFilterAttribute
, damit ASP.NET MVC mehr für Sie erledigt.Außerdem möchten Sie sicherstellen, dass Sie eine Autorisierung durchführen, bevor Sie die eigentliche Arbeit in der Aktionsmethode ausführen. Andernfalls besteht der einzige Unterschied zwischen angemeldet und nicht darin, welche Seite Sie nach Abschluss der Arbeit sehen.
Es gibt eine gute Frage mit einer Antwort mit mehr Details hier auf SO.
quelle
Versuchen Sie das folgende Snippet, es sollte ziemlich klar sein:
quelle
Hier ist eine Lösung, die auch berücksichtigt, wenn Sie Ajax-Anforderungen verwenden.
quelle
Das funktioniert bei mir (asp.net core 2.1)
quelle
Sie könnten Ihren Controller erben und ihn dann in Ihrem Aktionsfilter verwenden
in Ihrer ActionFilterAttribute-Klasse:
in Ihrem Basis-Controller:
Nachteile Dazu müssen alle Controller so geändert werden, dass sie von der Klasse "MyController" erben
quelle