3 Stimmen

Wann ist es sicher, eine Response.Redirect() auszuführen, ohne eine Ausnahme auszulösen?

Ich habe eine Zwischenklasse erweitern System.Web.UI.Page für alle meine Seiten, die Authentifizierung erfordern. Die Klasse macht hauptsächlich benutzerdefinierte Authentifizierung Handhabung.

Wenn ein Benutzer mit unzureichendem Zugriff versucht, eine Seite zu besuchen, versuche ich, den Benutzer zurück zur Anmeldeseite umzuleiten und gleichzeitig zu verhindern, dass weitere Seitenereignisse ausgeführt werden (z. B. Page_load). Die erste Lösung, die mir in den Sinn kam, war die Standardimplementierung von Response.Redirect. Dies hat natürlich den Nachteil, dass ThreadAbortExceptions ausgelöst werden können.

Meine Frage ist also folgende: Wann (wenn überhaupt) während des Lebenszyklus der Seite ist es eigentlich sicher, Response.Redirect() auszuführen, ohne dass ThreadAbortException jemals ausgelöst wird?

public class CustomPage : System.Web.UI.Page
{
    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        if (!IsValid())
            Response.Redirect("login.aspx", true);
    }
}

5voto

womp Punkte 113535

Es ist niemals "sicher", wenn Sie true als zweiten Parameter übergeben - es wird immer eine Ausnahme ausgelöst. Intern, Response.Redirect() ruft auf. Response.End() , was den aktuellen Thread direkt abbricht.

Der einzige "sichere" Weg, eine Datei abzuschneiden HttpRequest ohne dass eine Ausnahme ausgelöst wird, ist durch die Verwendung von HttpApplication.CompleteRequest() Dies führt jedoch zu einer weiteren Codeausführung in der aktuellen Anfrage.

1voto

casperOne Punkte 72238

Neugierig, warum machen Sie das selbst? Wenn überhaupt, sollten Sie einen der Authentifizierungsanbieter verwenden (schließlich kann FormsAuthentication so angepasst werden, dass es fast jedes erdenkliche Szenario abdeckt).

Dann können Sie die Berechtigungselement in Ihrer web.config-Datei, um anzugeben, auf welche Seiten/Verzeichnisse anonyme Benutzer nicht zugreifen können. ASP.NET kümmert sich um den Rest, indem es den Benutzer auf die von Ihnen angegebene Anmeldeseite umleitet und zurückleitet, wenn sich der Benutzer angemeldet hat.

0voto

Jonathan Allen Punkte 65707

Wenn Sie keine ThreadAbort-Ausnahme wünschen, sollten Sie False an den endResponse-Parameter übergeben. Das bedeutet natürlich, dass Sie den Rest der Seite verarbeiten müssen, was schwer zu bewerkstelligen ist.

Wenn Sie nicht gerade etwas wirklich Dummes tun, wie z. B. eine Sperre halten, ist es vollkommen sicher, eine ThreadAbort-Ausnahme in einer ASP.NET-Seite auszulösen.

Eine weitere Möglichkeit ist die Verwendung eines Server.Transfer. Dies hat eine bessere Leistung als eine Umleitung, aber auch hier werden ThreadAbort-Ausnahmen verwendet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X