hacer una publicación http desde el servidor utilizando credenciales de usuario - seguridad integrada
-
20-08-2019 - |
Pregunta
Estoy tratando de hacer una publicación, desde una página lateral del servidor asp classic, usando las credenciales de usuario ...
Estoy usando msxml2.ServerXMLHTTP para hacer la publicación programáticamente
He intentado con varias configuraciones en el sitio IIS 5.1, pero no hay forma de que IIS se ejecute con una cuenta especificada ...
Hice una pequeña página asp que ejecuta whoami para verificar qué cuenta está usando el proceso iis ...
con IIS 5.1, usando seguridad integrada que el proceso usa:
my_machine \ IWAM_my_machine
Desactivo la seguridad integrada, y dejo una cuenta de dominio como acceso anónimo, y obtengo lo mismo (& # 191 ;?)
para probar al usuario hago lo siguiente
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
¿es porque estoy emitiendo un comando de shell?
Me gustaría hacer llamadas post http, a otro sitio que funcione con seguridad integrada ...
Entonces, necesito alguna forma de pasar las credenciales, o al menos ejecutar con una cuenta específica, y luego configurar el sitio remoto para ingresar esa cuenta ...
Pensé que solo configurar el sitio para que funcione con seguridad integrada sería suficiente ...
¿Cómo puedo lograr tal cosa?
ps: con IIS6, sucede lo mismo pero si cambio la configuración de la piscina, obtengo la siguiente información de whoami
AUTORIDAD NT \ SERVICIO DE RED
AUTORIDAD NT \ SERVICIO LOCAL
NT AUTHORITY \ SYSTEM
si configuro una cuenta de dominio, obtengo un " servicio no disponible " mensaje ...
editar: encontré esto
dice lo que supuse, " Si un usuario autenticado hace una solicitud, el token de subproceso se basa en la cuenta autenticada del usuario " ;, pero de alguna manera no parece funcionar como eso ... ¿qué podría estar perdiendo?
editar:
bueno, lo de whoami obviamente me está engañando, intenté con la siguiente función
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
función final
y todo parecía estar funcionando bien ...
pero ¿cómo puedo hacer que msxml2.ServerXMLHTTP funcione con las credenciales de usuario ???
Solución
Tienes razón whoami.exe te estaba confundiendo. El lanzamiento de un proceso separado hizo que el nuevo proceso se ejecutara como el usuario del proceso actual. En XP, ese sería el host de la aplicación COM + (DLLHOST) y normalmente se ejecutaría como IWAM_<machine>
. En IIS6 funcionaría el proceso de trabajo w3wp.exe y normalmente se ejecuta como NT AUTHORITY \ Network Service.
Sin embargo, un subproceso que procesa una solicitud HTTP suplantará un token de seguridad diferente. Con la seguridad integrada como ha descubierto, esto sería el token de seguridad del usuario que realiza la solicitud, como lo confirma su experimento SSPI. Con el acceso anónimo, se utiliza el usuario anónimo configurado en el sitio / aplicación, esto suele ser <MACHINE>\IUSR_<machine>
.
En cuanto a su problema específico con ServerXMLHTTP, esto se remonta al componente subyacente WinHTTP. Por defecto, esto solo enviará las credenciales de los usuarios actuales si el servidor al que se accede es la lista de omisión de proxy. Incluso entonces es posible que ServerXMLHTTP lo configure para que nunca envíe las credenciales de usuario, no he probado ese escenario yo mismo.
Desafortunadamente, ServerXMLHTTP proporciona acceso muy limitado a los detalles de configuración en WinHTTP. Sin embargo, si este es un show stopper, siempre puede usar el componente WinHTTP directamente usted mismo: -
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
Eso debería funcionar para http, para https se vuelve realmente desordenado.