Доступ к сеансу в IHttpModule и возможность выполнить ответ.перенаправление

StackOverflow https://stackoverflow.com/questions/2655116

  •  27-09-2019
  •  | 
  •  

Вопрос

Следуя решению, найденному на Могу ли я получить доступ к состоянию сеанса из 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");
            }
        }

    }

Есть предположения?Спасибо за помощь!

Это было полезно?

Решение

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

Другие советы

Мой ответ включает в себя Ответ Arthurdent510 Но у меня недостаточно репутации просто комментировать его ответ Хаха. Его ответ мне много помогло понять, где мне пришлось идти, но это было не совсем завершено для меня.

Нанесение ответа. Предверенное вызов в обработчик Endrequest вызвал бесконечную петлю. Я думаю, что это потому, что ответ. Реакция. Таким образом, энпенсусь назывались снова и снова навсегда.

Чтобы обойти это, я добавил частное логическое значение, чтобы указать, если я позвонил ли я для перенаправления. Если я уже призвал для перенаправления, то я не буду позвонить в ответ. Это то, что мой метод 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top