Dieses Problem hat mich seit einigen Tagen verfolgt. Als ich die Antwort fand, die mit der obigen Antwort von tvanfosson positiv zusammenarbeitet, hielt ich es für sinnvoll, den Kernteil der Antwort hervorzuheben und einige verwandte Probleme anzusprechen.
Die Kernantwort lautet: süß und einfach:
filterContext.Result = new HttpUnauthorizedResult();
In meinem Fall erbe ich von einem Basis-Controller. In jedem Controller, der von diesem erbt, überschreibe ich OnAuthorize:
protected override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
YourAuth(filterContext);
}
Das Problem war, dass ich in 'YourAuth' zwei Dinge ausprobiert habe, von denen ich dachte, dass sie nicht nur funktionieren, sondern auch die Anfrage sofort beenden würden. Nun, so funktioniert es nicht. Also zuerst die zwei Dinge, die NICHT unerwartet funktionieren:
filterContext.RequestContext.HttpContext.Response.Redirect("/Login");
FormsAuthentication.RedirectToLoginPage();
Diese funktionieren nicht nur nicht, sie beenden auch die Anfrage nicht. Was bedeutet folgendes:
if (!success) {
filterContext.Result = new HttpUnauthorizedResult();
}
DoMoreStuffNowThatYouThinkYourAuthorized();
Nun, auch mit der richtigen Antwort oben geht der Logikfluss weiter! Sie werden weiterhin DoMoreStuff ... in OnAuthorize drücken. Denken Sie also daran (DoMore ... sollte daher in einem anderen sein).
Aber mit der richtigen Antwort, während der OnAuthorize-Logikfluss noch bis zum Ende andauert, erhalten Sie danach wirklich das, was Sie erwarten: eine Weiterleitung zu Ihrer Anmeldeseite (wenn Sie eine in Forms auth in Ihrer Webkonfiguration festgelegt haben).
Aber unerwartet funktioniert 1) Response.Redirect ("/ Login") nicht: Die Action-Methode wird weiterhin aufgerufen, und 2) FormsAuthentication.RedirectToLoginPage (); macht das gleiche: Die Action-Methode wird immer noch aufgerufen!
Was mir völlig falsch erscheint, insbesondere bei letzterem: Wer hätte gedacht, dass FormsAuthentication.RedirectToLoginPage die Anforderung nicht beendet, oder das Äquivalent darüber, was filterContext.Result = new HttpUnauthorizedResult () tut?