Sesión de acceso en ihttpmodule y poder hacer una respuesta.
-
27-09-2019 - |
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!
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