1

我正在尝试使用用户凭据从 asp 经典服务器端页面发布帖子...

我正在使用 msxml2.ServerXMLHTTP 以编程方式发布帖子

我已经在 IIS 5.1 站点中尝试了几种配置,但是我无法让 IIS 使用指定的帐户运行......

我制作了一个运行 whoami 的小 asp 页面,以验证我使用的 iis 进程是什么帐户...

对于 IIS 5.1,使用集成安全性,该过程使用:

my_machine\IWAM_my_machine

我禁用集成安全性,并将域帐户保留为匿名访问,我得到相同的结果(¿?)

为了测试用户,我执行以下操作


private function whoami()
dim shell, cmd

    set shell = createObject("wscript.shell") 
    set cmd = shell.exec( server.mapPath( "whoami.exe" ) )
    whoami = cmd.stdOut.readAll() 
    set shell = nothing: set cmd = nothing 

end function

是因为我正在发出一个shell命令吗?

我想对另一个具有集成安全性的站点进行 http post 调用...

所以我需要一些方法来传递凭据,或者至少使用指定的帐户运行,然后配置远程站点以推送该帐户......

我认为仅将站点设置为使用集成安全性就足够了...

我怎样才能做到这一点?

ps:使用 IIS6,情况相同,但如果我更改池配置,我会从 whoami 获得以下信息

NT AUTHORITY\网络服务

NT 当局\本地服务

NT AUTHORITY\SYSTEM

如果我设置域帐户,我会收到“服务不可用”消息...

编辑:找到这个

http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/275269ee-1b9f-4869-8d72-c9006b5bd659.mspx?mfr=true

它说的是我所想的,“如果经过身份验证的用户提出请求,线程令牌基于用户的经过身份验证的帐户”,但不知何故我似乎不像那样工作......我可能会错过什么?

编辑:

那么 whoami 的事情显然在愚弄我,我尝试了以下功能


private function whoami_db( serverName, dbName )
dim conn, data

set conn = server.createObject("adodb.connection")
conn.open       "Provider=SQLOLEDB.1;Integrated Security=SSPI;" & _
                        "Initial Catalog=" & dbName & ";Data Source=" & serverName
set data = conn.execute( "select suser_sname() as user_name" )

whoami_db = data("user_name")

data.close: conn.close
set data = nothing: set conn = nothing

end function

一切似乎都运行良好......

但我怎样才能让 msxml2.ServerXMLHTTP 与用户凭据一起工作???

4

1 回答 1

1

你是正确的 whoami.exe 让你感到困惑。启动一个单独的进程会导致新进程以当前进程的用户身份运行。在 XP 上,它将是 COM+ 应用程序主机 (DLLHOST),通常以IWAM_<machine>. 在 IIS6 上,它将 w3wp.exe 工作进程,通常作为 NT AUTHORITY\Network Service 运行。

但是,处理 HTTP 请求的线程将模拟不同的安全令牌。正如您发现的那样,使用集成安全性,这将是发出请求的用户的安全令牌,正如您的 SSPI 实验所证明的那样。对于匿名访问,使用在站点/应用程序上配置的匿名用户,这通常是<MACHINE>\IUSR_<machine>.

至于您使用 ServerXMLHTTP 的具体问题,这可以追溯到底层组件 WinHTTP。默认情况下,如果正在访问的服务器是代理绕过列表,则只会发送当前用户凭据。即使这样,ServerXMLHTTP 也可以将其配置为从不发送用户凭据,我自己还没有测试过这种情况。

不幸的是,ServerXMLHTTP 对 WinHTTP 上的配置细节提供了非常有限的访问。但是,如果这是一个显示停止器,那么您始终可以自己直接使用 WinHTTP 组件:-

Dim oWinHTTP
Dim oDOM

    Const AutoLogonPolicy_Always = 0

Set oWinHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")

oWinHTTP.SetAutoLogonPolicy AutoLogonPolicy_Always

oWinHTTP.Open "GET", "http://remoteserver.org/getsomexml.xxx", False
oWinHTTP.Send

If oWinHTTP.Status = 200 Then
    Set oDOM = CreateObject("MSXML2.DOMDocument.3.0")
    oDOM.async = false
    oDOM.Load oWinHTTP.ResponseStream     
End If

Set oWinHTTP = Nothing

这应该适用于 http,对于 https 它变得非常混乱。

于 2009-06-26T21:50:58.680 回答