sessione di accesso in IHttpModule e di essere in grado di fare un Response.Redirect

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

  •  27-09-2019
  •  | 
  •  

Domanda

A seguito della soluzione trovata a Posso stato della sessione di accesso da un HttpModule ? , sono in grado di accedere allo stato della sessione da un IHttpModule. Lo sto usando per controllare l'accesso ad alcuni file, quindi nel caso qualcuno non ha accesso, vorrei per orientarle verso una pagina di login. Quando provo a fare un HttpContext.Current.Response.Redirect (pagina); si blocca il server su web. Quindi il mio post acquisire richiesta di stato in funzione come questa ...

 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");
            }
        }

    }

Qualche idea? Grazie per l'aiuto!

È stato utile?

Soluzione

Ok, così ho trovato una soluzione ... ho spostato la mia variabile hasaccess essere globale e aggiunto un gestore EndRequest. Così sto controllando per hasaccess in EndRequest e fare il redirect da lì.

Altri suggerimenti

La mia risposta include di Arthurdent510 risposta ma non hanno abbastanza reputazione da solo commento sulla sua risposta haha. La sua risposta mi ha aiutato molto a capire dove dovevo andare, ma non era abbastanza completo per me.

Mettere la chiamata Response.Redirect nel gestore EndRequest causato un ciclo infinito. Penso che questo sia perché il Response.Redirect provoca EndRequest di essere chiamato. Così EndRequest era stato chiamato più e più volte per sempre.

Per aggirare il problema, ho aggiunto un valore booleano privato per indicare se ho già chiamato per il reindirizzamento. Se ho già chiamato per il reindirizzamento, allora non chiamare di nuovo Response.Redirect. Questo è ciò che il mio metodo EndRequest sembrava:

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top