Question

Suite à la solution trouvée Can état de session d'accès à partir d'un HttpModule , je suis en mesure d'accéder à l'état de la session d'un IHttpModule. Je l'utilise pour contrôler l'accès à certains fichiers, donc dans le cas où quelqu'un n'a pas accès, je voudrais les rediriger vers une page de connexion. Lorsque je tente de faire une HttpContext.Current.Response.Redirect (page); il bloque le haut du serveur web. Donc, ma fonction de l'état demande après Acquire ressemble à ...

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

    }

Toutes les pensées? Merci pour l'aide!

Était-ce utile?

La solution

Ok, donc j'ai trouvé une solution ... je me suis déplacé ma variable hasAccess être globale et a ajouté un gestionnaire EndRequest. Donc, je vérifie pour hasAccess dans EndRequest et de faire la redirection à partir de là.

Autres conseils

Ma réponse comprend de réponse Arthurdent510 mais je ne l'ai pas assez réputation simplement commenter sa réponse haha. Sa réponse m'a beaucoup aidé à comprendre où je devais aller, mais il n'a pas été tout à fait complet pour moi.

Mettre l'appel Response.Redirect dans le gestionnaire EndRequest a provoqué une boucle infinie. Je pense que cela est parce que le Response.Redirect provoque EndRequest être appelé. Alors EndRequest était appelé encore et toujours.

Pour contourner ce problème, j'ai ajouté un booléen privé pour indiquer si je l'ai déjà appelé pour la redirection. Si je l'ai déjà appelé pour la redirection, alors je ne vais pas appeler Response.Redirect à nouveau. C'est ce que ma méthode EndRequest ressemblait à:

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top