Sessão de acesso em ihttpmodule e poder fazer uma resposta.Redirect
-
27-09-2019 - |
Pergunta
Seguindo a solução encontrada em Posso acessar o estado da sessão de um httpmodule?, Posso acessar o estado da sessão a partir de um ihttpmodule. Estou usando -o para controlar o acesso a alguns arquivos; portanto, no caso de alguém não ter acesso, gostaria de redirecioná -los para uma página de login. Quando tento fazer um httpcontext.current.Response.redirect (página); Ele bloqueia o servidor da web. Então, meu post adquiriu a função de estado de solicitação se parece com isso ...
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");
}
}
}
Alguma ideia? Obrigado pela ajuda!
Solução
OK, então encontrei uma solução alternativa ... Eu movi minha variável Hasaccess para ser global e adicionei um manipulador de Endrequest. Então, estou checando o Hasaccess em Endrequest e fazendo o redirecionamento a partir daí.
Outras dicas
Minha resposta inclui Resposta de Arthurdent510 Mas não tenho reputação suficiente para simplesmente comentar sua resposta haha. Sua resposta me ajudou muito a descobrir para onde eu tinha que ir, mas não foi completamente completa para mim.
Colocando a resposta. Redirect Call no Endrequest Handler causou um loop infinito. Eu acho que isso ocorre porque a resposta. O Rredirect faz com que o EndEquest seja chamado. Então, Endrequest estava sendo chamado repetidamente.
Para contornar isso, adicionei um booleano privado para indicar se já pedi o redirecionamento. Se eu já pedi o redirecionamento, não chamarei a resposta.Redirect novamente. É assim que meu método Endrequest parecia:
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