Zugriff auf Sitzung in IHTTPModule und in der Lage sein, eine Antwort zu machen. REDirect

StackOverflow https://stackoverflow.com/questions/2655116

  •  27-09-2019
  •  | 
  •  

Frage

Folgt der Lösung bei Kann ich von einem httpmodule auf den Sitzungsstatus zugreifen?, Ich kann von einem IHTTPModule auf den Sitzungsstatus zugreifen. Ich verwende es, um den Zugriff auf einige Dateien zu steuern. Für den Fall, dass jemand keinen Zugriff hat, möchte ich sie zu einer Anmeldeseite umleiten. Wenn ich versuche, eine httpcontext.current.response.redirect (Seite) zu machen; Es sperrt den Webserver. Mein Beitrag erfasst die Anforderungsstatusfunktion also so ...

 void Application_PostAcquireRequestState(object source, EventArgs e)
    {            
        HttpApplication app = (HttpApplication)source;

        MyHttpHandler resourceHttpHandler = HttpContext.Current.Handler as MyHttpHandler;

        if (resourceHttpHandler != null)
        {
            // set the original handler back
            HttpContext.Current.Handler = resourceHttpHandler.OriginalHandler;
        }

        HttpContext context = HttpContext.Current;
        string filePath = context.Request.FilePath;
        context.Trace.Write("HttpDownloadModule", "File path: " + filePath);

        Boolean hasAccess = true;

        if (filePath.Contains("content/downloads"))
        {
            //check to make sure a session has been established already....
            if (context.Session == null)
                hasAccess = false;

            SecurityBLL security = new SecurityBLL();
            string fileName = filePath.Split('/').Last();

            //check to see if a user is logged in
            if (!CitrixAccess.loggedin)
                hasAccess = false;

            //check access for download
            if (!security.checkSecurityByDownload(fileName))
                hasAccess = false;

            if (!hasAccess)
            {
                HttpContext.Current.Handler = resourceHttpHandler.OriginalHandler;
                HttpContext.Current.Response.Redirect("../../login.aspx");
            }
        }

    }

Irgendwelche Gedanken? Danke für die Hilfe!

War es hilfreich?

Lösung

Ok, also habe ich eine Problemumgehung gefunden ... Ich habe meine Has -Access -Variable als global bewegt und einen EndRequest -Handler hinzugefügt. Ich checke also nach einem Access in EndRequest und mache die Umleitung von dort aus.

Andere Tipps

Meine Antwort beinhaltet ARTHURDENT 510 Antwort Aber ich habe nicht genug Ruf, um einfach seine Antwort zu kommentieren, haha. Seine Antwort hat mir sehr geholfen, herauszufinden, wohin ich gehen musste, aber es war für mich nicht ganz vollständig.

Die Reaktion aufzunehmen. REDIRECT -Anruf im EndRequest -Handler verursachte eine unendliche Schleife. Ich denke, das liegt daran, dass die Reaktion. REDirect bewirkt, dass EndRequest aufgerufen wird. Also wurde EndRequest immer immer für immer gerufen.

Um dies zu umgehen, habe ich einen privaten Booleschen hinzugefügt, um anzuzeigen, ob ich bereits die Umleitung angerufen habe. Wenn ich bereits nach der Umleitung angerufen habe, werde ich die Antwort nicht erneut aufrufen. So sah meine EndRequest -Methode aus:

Private Sub Application_EndRequest(ByVal source As Object, ByVal e As EventArgs)
    If Not _blnHasAccess AndAlso Not _blnRedirected Then
        _blnRedirected = True
        HttpContext.Current.Response.Redirect("~/Error.aspx")
    End If
End Sub
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top