2009-10-23 81 views
1

我有一個Web應用程序使用CDO消息對象發送電子郵件報告。HTTP請求對象和處理本地請求

例如:

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

的問題是,當它使得其請求到IIS,它不繼承的登錄用戶,即用於驗證允許訪問之前,請求會話變量ASP會話標識內容是空白的。這使得認證強硬,迫使我補充一個查詢字符串變量(因爲你可以看到,你不能添加一個表單變量對這一要求),如:

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

肯定有必須在報告中授權的方式檢查請求是否來自本地機器,即郵件程序腳本中的CDO對象,從而否定了對身份驗證的需求?

+0

@Jimbo:編輯我的回答以解決您的評論。 – AnthonyWJones 2009-10-24 21:22:24

回答

2

只是不這樣做!由於這些原因: -

  • 將第二個請求返回到服務器將導致當前線程阻塞,如果您有太多這些請求會導致應用程序死鎖。
  • CreateHTMLBody internaly使用WinINET http堆棧發出請求。該堆棧旨在用於客戶端交互式場景。在服務器場景中,它不是線程安全的。
  • 你失去了所有的會話上下文,所以它可以(如你所發現的)使事情變得更加困難或不太安全。此外,它可能會創建一些不需要的會話。

雖然其真實CreateHTMLBody可以非常方便,它也可以創建臃腫的電子郵件。在服務器的情況下,你真的需要用代碼製作電子郵件,而不是使用這種誘人的方法。

編輯

看來金寶心中都有不僅僅是CreateHTMLBody更普遍的情形。一般情況是,一個ASP頁面(我們將這個「客戶端頁面」指定爲一個組件(消費者無法控制的組件)),並且它會向另一個ASP頁面發送後續請求(可能通過WinINET)將指定這個「服務頁面」)。假定「客戶端頁面」可以控制組件的使用唯一的東西是提供給它的URL。

以下是一些避免或減輕上述問題的方法。

處理鎖定問題:在不同的ASP應用程序中放置「客戶端頁面」和「服務頁面」可以避免鎖定問題。我的建議是將「客戶端頁面」放在與應用程序的其他應用程序不同的應用程序中,並且此新應用程序將位於主應用程序的子文件夾中。

處理WinINET問題:將新應用程序放置在其自己的應用程序池中。如果以不安全的方式使用WinINET會造成問題,則不會影響主應用程序進程。事實上,把它放在自己的過程中可能有助於避免這種問題。 (在這裏沒有保證,但它是你可以完全避免WinINET問題的最佳選擇)。

控制安全性:將「服務頁面」配置爲只接受來自「客戶端頁面」的請求。可能有很多方法可以做到這一點,但最簡單的方法是啓用基於IP的安全性,對「服務頁面」的請求只應來自特定IP或至少一組有限的IP地址。

處理身份驗證:在主應用程序登錄創建包含一些獨特的價值揮發性的cookie。由於「客戶端頁面」被瀏覽器視爲主應用程序的子文件夾,因此它將收到此cookie。 「客戶端頁面」可以使用此cookie來確認請求的真實性和/或在使用該組件時將其傳遞到URL中。

Supressing多產的會話創建:有「服務頁面」叫Session.Abandon它完成其操作之前。

+0

嗚......我不知道CreateHTMLBody使用了WinINET堆棧。我通常不會使用XMLHTTP,而是出於同樣的原因使用ServerXMLHTTP。 +1 – Kev 2009-10-23 16:04:42

+0

感謝您的回覆。不幸的是,這種應用程序有很多例子,使用也使用類似的GetContentFromURL的PDF創建控件 - 這些實例沒有替代方案。 – Jimbo 2009-10-24 10:53:07