Доступ к сеансу в IHttpModule и возможность выполнить ответ.перенаправление
-
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