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!

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top