Вопрос

У меня есть веб-приложение, которое использует объект CDO Message для отправки отчетов по электронной почте.

Например:

Dim objCDO
Set objCDO = Server.CreateObject("CDO.Message")
objCDO.CreateMHTMLBody "http://server/report.asp"

Проблема в том, что когда он отправляет свой запрос в IIS, он не наследует идентификатор сеанса ASP вошедшего в систему пользователя, т.е.переменные сеанса, используемые для проверки подлинности запросов перед разрешением доступа к содержимому, являются пустыми.Это усложняет аутентификацию, заставляя меня добавлять переменную querystring (потому что, как вы можете видеть, вы не можете добавить переменную формы к этому запросу), например:

objCDO.CreateMHTMLBody "http://server/report.asp?userid=xx&password=xx"

КОНЕЧНО, в отчете должен быть способ авторизации, позволяющий проверить, поступил ли запрос с локального компьютера, т.е.объект CDO в скрипте почтовой программы, таким образом, отменяющий необходимость аутентификации?

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

Решение

Просто не делай этого!По этим причинам:-

  • Повторный запрос обратно на сервер приведет к блокировке текущего потока, если у вас их слишком много, вы приведете приложение в тупиковую ситуацию.
  • CreateHTMLBody внутренне использует http-стек WinInet для выполнения запроса.Этот стек предназначен для использования в клиентских интерактивных сценариях.В серверном сценарии это не является потокобезопасным.
  • Вы теряете весь контекст сеанса, поэтому это может (как вы обнаруживаете) сделать что-то более сложным или менее безопасным.Кроме того, это может создать нагрузку на нежелательные сеансы.

В то время как это истинно CreateHTMLBody может быть очень удобным, он также может создавать раздутые электронные письма.В ситуации с сервером вам действительно нужно создать электронное письмо с помощью кода, а не использовать этот заманчивый метод.

Редактировать

Похоже, Джимбо имеет в виду более общие сценарии, чем просто CreateHTMLBody.Общий сценарий заключается в том, что компонент (над которым потребитель не имеет контроля) используется на странице ASP (мы обозначим это как "Клиентскую страницу"), и он выполняет последующий запрос (возможно, через WinInet) на другую страницу ASP (мы обозначим это как "Служебную страницу").Предполагается, что единственное, что "Клиентская страница" может контролировать в отношении использования компонента, - это предоставленный ей URL.

Вот несколько подходов, позволяющих избежать или смягчить проблемы, описанные выше.

Устранение Проблем с блокировкой: Размещение "Клиентской страницы" и "Сервисной страницы" в разных приложениях ASP позволило бы избежать проблем с блокировкой.Мое предложение состояло бы в том, чтобы поместить "Страницу клиента" в приложение, отличное от остальной части приложения, и чтобы это новое приложение находилось во вложенной папке основного приложения.

Решение проблем с WinInet: Поместите новое приложение в его собственный пул приложений.Если использование WinInet небезопасным способом действительно вызывает проблему, это не влияет на основной процесс приложения.Действительно, включение его в собственный процесс может помочь избежать подобных проблем.(Здесь нет никаких гарантий, но это лучшее, что вы можете сделать, чтобы полностью избежать проблем с WinInet).

Контроль безопасности: Настройте "Страницу обслуживания" так, чтобы она принимала запросы только со "Страницы клиента".Вероятно, существует несколько способов сделать это, но самый простой - включить защиту на основе IP, запросы на "Страницу сервиса" должны поступать только с определенного IP-адреса или, по крайней мере, с ограниченного набора IP-адресов.

Обработка аутентификации: Во время входа в основное приложение создайте изменяемый файл cookie, содержащий некоторое уникальное значение.Поскольку браузер воспринимает "Страницу клиента" как подпапку основного приложения, оно получит этот файл cookie."Страница клиента" может использовать этот файл cookie для подтверждения подлинности запроса и/или передачи его в URL-адресе при использовании компонента.

Подавление создания продуктивной сессии: Вызовите "Страницу обслуживания" Session.Abandon до того, как он завершит свою работу.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top