Pregunta

Siguiendo la solución encontrada en ¿Puedo acceder al estado de sesión desde un httpmodule?, Puedo acceder al estado de sesión desde un ihttpmodule. Lo estoy usando para controlar el acceso a algunos archivos, por lo que en caso de que alguien no tenga acceso, me gustaría redirigirlos a una página de inicio de sesión. Cuando intento hacer un httpcontext.current.response.redirect (página); bloquea el servidor web. Así que mi función de estado de solicitud de adquisición posterior se ve así ...

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

    }

¿Alguna idea? ¡Gracias por la ayuda!

¿Fue útil?

Solución

Ok, entonces encontré una solución ... moví mi variable de Hasaccess para ser global y agregué un manejador de EndRequest. Así que estoy revisando el Hasaccess en EndRequest y haciendo la redirección desde allí.

Otros consejos

Mi respuesta incluye Respuesta de Arthurdent510 Pero no tengo suficiente reputación para simplemente comentar su respuesta jaja. Su respuesta me ayudó mucho a averiguar a dónde tenía que ir, pero no estaba del todo completo para mí.

Poner la respuesta. La llamada de redirección en el controlador de EndRequest causó un bucle infinito. Creo que esto se debe a que la respuesta. Redirección hace que se llame endRequest. Entonces EndRequest estaba siendo llamado una y otra vez para siempre.

Para evitar esto, agregué un booleano privado para indicar si ya pedí la redirección. Si ya pedí la redirección, no llamaré a respuesta. Redirect nuevamente. Así es como se veía mi método endRequest:

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top