Доступ к сессии в IHttpModule и возможность сделать response.redirect - PullRequest
0 голосов
/ 16 апреля 2010

Следуя решению, найденному на Могу ли я получить доступ к состоянию сеанса из HTTPModule? , я могу получить доступ к состоянию сеанса из IHttpModule. Я использую его для контроля доступа к некоторым файлам, поэтому, если у кого-то нет доступа, я бы хотел перенаправить их на страницу входа. Когда я пытаюсь сделать HttpContext.Current.Response.Redirect (page); он блокирует веб-сервер. Итак, моя функция состояния запроса на получение поста выглядит следующим образом ...

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

    }

Есть мысли? Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 04 января 2014

Мой ответ включает Ответ Артурдента510 , но у меня недостаточно репутации, чтобы просто комментировать его ответ, ха-ха. Его ответ помог мне НАМНОГО понять, куда я должен был пойти, но он был не совсем полным для меня.

Помещение вызова Response.Redirect в обработчик EndRequest вызвало бесконечный цикл. Я думаю, это потому, что Response.Redirect вызывает EndRequest. Таким образом, EndRequest вызывался снова и снова навсегда.

Чтобы обойти это, я добавил приватное логическое значение, чтобы указать, если я уже вызывал для перенаправления. Если я уже вызвал перенаправление, то больше не буду вызывать Response.Redirect. Вот как выглядел мой метод 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
0 голосов
/ 17 апреля 2010

Хорошо, я нашел обходной путь ... Я переместил переменную hasAccess в глобальную и добавил обработчик EndRequest. Поэтому я проверяю hasAccess в EndRequest и делаю перенаправление оттуда.

...