如何從動態伺服器網頁 (Active Server Page) 模擬使用者

文章翻譯 文章翻譯
文章編號: 248187 - 檢視此文章適用的產品。
本文曾發行於 CHT248187
全部展開 | 全部摺疊

結論

本文將告訴您動態伺服器網頁 (ASP) 的模擬和安全性內容。文中內容會提供可從 ASP 網頁產生實體的 Microsoft Visual Basic ActiveX 動態連結程式庫 (DLL) 程式碼範例,以便模擬使用者並變更目前執行緒的安全性內容。

根據預設,ASP 會在模擬使用者的安全性內容中執行。Web 伺服器會在收到對 ASP 檔案的要求時使用工作執行緒,並將該執行緒的安全性內容設定為模擬使用者。Internet Information Server (IIS) 驗證方法 (匿名、基本、NT 整合等) 會決定模擬使用者為何。接著,ASP 程式碼就會在該使用者的內容中執行。

您可以在模擬使用者時,解決下列出現在應用程式中的安全性衝突:
  • 使用「NT 整合」(NTLM) 安全性或是 Kerberos 來驗證,而且必須通過「具名管道」通訊協定來存取網路資源 (例如,檔案、Access 資料庫或是 SQL Server) 的應用程式。
  • Session_OnEndApplication_OnEnd 事件來存取網路資源的應用程式。

    使用處理程序的識別碼來執行 Session_OnEndApplication_OnEnd 事件。如果是同處理序或「低」應用程式保護的應用程式,這個識別碼就會是 SYSTEM 使用者 ID,而處理程序就會是 Inetinfo.exe 檔案。相對於模擬,您也可以執行不同的記憶體處理程序、或是使用「高」(獨立的) 應用程式保護,並將 Microsoft Transaction Server (MTS) 套件或 COM+ 應用程式的識別碼設定為想要的使用者 ID。
  • 支援多位使用者透過「Microsoft Active Directory 服務介面」(Microsoft Active Directory Services Interface,ADSI) 連線到 WinNT:// 命名空間的應用程式。

    這些連線會與第一個開啟連線的使用者安全性憑證,一起存入快取。 執行模擬可以確保只有單一使用者開啟該連線;因此,該使用者的憑證就會與快取的憑證相符。

其他相關資訊

模擬會使用下列三種函式:
  1. LogonUser 函式會接收登入資訊 (使用者 ID、密碼等資訊),以及傳回有效登入的安全性權杖。
  2. ImpersonateLoggedOnUser 函式會接收 LogonUser 的安全性權杖,並將該權杖套用到目前的執行緒中。
  3. RevertToSelf 函式會將執行緒傳回到原始處理程序的安全性內容。

    RevertToSelf 是從 ASP 進行模擬過程中極為重要的一個函式。這個函式會在 LogonUserImpersonateLoggedOnUser 之前呼叫,以確保目前的安全性內容可以進行模擬。(如果您已經從 ASP 進行模擬,您就很有可能沒有進行模擬的必要授權)。RevertToSelf 會在網頁處理最後進行呼叫,以確保下次使用執行緒時還可以使用適當的安全性內容,也就是原始處理程序的識別碼。
下面這個 ActiveX DLL 中有兩種方法:登入登出登入會將執行緒內容變更成為新的使用者 ID,而登出會還原此原始處理程序的識別碼。如果要建立這個 DLL,請依照下列步驟執行:
  1. 使用 Visual Basic 6.0,建立名為 LoginAdmin 的新 ActiveX DLL 專案。
  2. 將初始類別模組的名稱變更為 ImpersonateUser。
  3. 在專案中加入名為 LogonAPIs.bas 的模組,再貼上下列這段程式碼,讓您的類別可以進行 API 呼叫:
       Public Declare Function LogonUser Lib "advapi32.dll" _
    Alias "LogonUserA" (ByVal lpszUsername As String, _
    ByVal lpszDomain As String, ByVal lpszPassword As String, _
    ByVal dwLogonType As Long, ByVal dwLogonProvider As Long, _
    phToken As Long) As Long
    
       Public Declare Function ImpersonateLoggedOnUser Lib "advapi32.dll" (ByVal hToken As Long) As Long
    
       Public Declare Function RevertToSelf Lib "advapi32.dll" () As Long
    
       Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
  4. 開啟 ImpersonateUser 類別模組,再貼上下列這段程式碼來建立 LogonLogoff 方法:
       Private Const LOGON32_LOGON_INTERACTIVE = 2
       Private Const LOGON32_PROVIDER_DEFAULT = 0
    
       Public Sub Logon(ByVal strAdminUser As String, ByVal _
    strAdminPassword As String, ByVal strAdminDomain As String)
         Dim lngTokenHandle, lngLogonType, lngLogonProvider As Long
         Dim blnResult As Boolean
         
         lngLogonType = LOGON32_LOGON_INTERACTIVE
         lngLogonProvider = LOGON32_PROVIDER_DEFAULT
         
         blnResult = RevertToSelf()
         
         blnResult = LogonUser(strAdminUser, strAdminDomain, strAdminPassword, _
                                              lngLogonType, lngLogonProvider, _
                                              lngTokenHandle)
                                                              
         blnResult = ImpersonateLoggedOnUser(lngTokenHandle)
         CloseHandle (lngTokenHandle)
    
       End Sub
    
       Public Sub Logoff()
         Dim blnResult As Boolean
         
         blnResult = RevertToSelf()
       End Sub
    注意:呼叫 LogonUser 時會傳遞 LOGON32_LOGON_INTERACTIVE 登入類型。 我們可以透過這種互動式登入,來存取其他登入類型無法存取的網路資源。
  5. 儲存專案檔案。
  6. [檔案] 功能表上,按一下 [建立 LoginAdmin.dll] 來編譯 ActiveX DLL。
  7. 將 LoginAdmin.dll 複製到 Web 伺服器,再使用 Regsvr32.exe 進行登錄 (在命令提示字元中輸入 regsvr32.exe c:\components\LoginAdmin.dll)。
  8. 在登錄 ActiveX DLL 之後,您便可以依照下列方式從 ASP 網頁呼叫它:
       <%
         Option Explicit
         Dim objLogon
    
         Set objLogon = Server.CreateObject("LoginAdmin.ImpersonateUser")
         objLogon.Logon "Userid", "Password", "Domain"
    
         'Body of code for the page.
    
         objLogon.Logoff
         Set objLogon = Nothing
       %>
    					
注意:當您呼叫 RevertToSelf 時,ASP 網頁將會在處理程序的安全性內容下執行。如果是同處理序應用程式,這時就會在 System 帳戶下執行。 但是,如果是共用或獨立的應用程式,這時就會使用已針對共用應用程式或獨立應用程式完成設定的 COM+ 套件識別碼。根據預設,這些 COM+ 套件的識別碼是設定為 IWAM_<computername>。如果這個帳戶沒有「作為作業系統的一部份」權限,接續呼叫 LogonUser 時就會因為權限違規而失敗。替代解決方案是為 IWAM_<computername> 帳戶啟用「作為作業系統的一部份」權限,或是設定 COM+ 套件的識別碼,使其在擁有這些權限的帳戶下執行。

屬性

文章編號: 248187 - 上次校閱: 2005年7月11日 - 版次: 4.2
這篇文章中的資訊適用於:
  • Microsoft Active Server Pages 4.0
  • Microsoft Internet Information Server 4.0
  • Microsoft Internet Information Services 5.0
關鍵字:?
kbhowto kbsecurity KB248187
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com