creare un post http dal server utilizzando le credenziali dell'utente - sicurezza integrata
-
20-08-2019 - |
Domanda
Sto provando a scrivere un post, dalla pagina di un server ASP classico, usando le credenziali dell'utente ...
Sto usando msxml2.ServerXMLHTTP per scrivere programmaticamente il post
Ho provato con diverse configurazioni nel sito IIS 5.1, ma non è possibile far funzionare IIS con un account specificato ...
Ho creato una piccola pagina ASP che esegue whoami per verificare quale account sto utilizzando ...
con IIS 5.1, utilizzando la sicurezza integrata il processo utilizza:
MY_MACHINE \ IWAM_my_machine
Disattivo la sicurezza integrata e lascio un account di dominio come accesso anonimo e ottengo lo stesso (& # 191 ;?)
per testare l'utente faccio quanto segue
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
è perché sto inviando un comando shell?
Mi piacerebbe effettuare chiamate post HTTP su un altro sito che funziona con sicurezza integrata ...
Quindi ho bisogno di un modo per passare le credenziali, o almeno per funzionare con un account specificato, e quindi configurare il sito remoto per spingere quell'account ...
Ho pensato che impostare il sito in modo che funzionasse con sicurezza integrata sarebbe bastato ...
Come posso ottenere una cosa del genere?
ps: con IIS6, succede lo stesso ma se cambio la configurazione del pool ricevo le seguenti informazioni da whoami
NT AUTHORITY \ NETWORK SERVICE
NT AUTHORITY \ LOCAL SERVICE
NT AUTHORITY \ SYSTEM
se imposto un account di dominio, ottengo un " servizio non disponibile " il messaggio ...
modifica: trovato questo
dice ciò che ho superato, " Se un utente autenticato fa una richiesta, il token del thread si basa sull'account autenticato dell'utente " ;, ma in qualche modo non sembra funzionare come che ... cosa potrei forse perdere?
modifica:
beh la cosa whoami ovviamente mi sta prendendo in giro, ho provato con la seguente funzione
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
fine funzione
e tutto sembrava funzionare bene ...
ma come posso far funzionare msxml2.ServerXMLHTTP con le credenziali dell'utente ???
Soluzione
Hai ragione whoami.exe ti stava confondendo. L'avvio di un processo separato ha comportato l'esecuzione del nuovo processo come utente del processo corrente. Su XP quello sarebbe l'host dell'applicazione COM + (DLLHOST) e normalmente verrebbe eseguito come IWAM_<machine>
. Su IIS6 sarebbe il processo di lavoro w3wp.exe e in genere viene eseguito come NT AUTHORITY \ Network Service.
Tuttavia, un thread che elabora una richiesta HTTP impersonerà un diverso token di sicurezza. Con la sicurezza integrata, come hai scoperto, questo sarebbe il token di sicurezza dell'utente che effettua la richiesta, come dimostra l'esperimento SSPI. Con l'accesso anonimo viene utilizzato l'utente anonimo configurato nel sito / nell'applicazione, generalmente <MACHINE>\IUSR_<machine>
.
Per quanto riguarda il tuo problema specifico con ServerXMLHTTP, questo risale al componente sottostante WinHTTP. Questo per impostazione predefinita invierà le credenziali degli utenti correnti solo se il server a cui si accede è l'elenco di bypass proxy. Anche così, ServerXMLHTTP lo configura per non inviare mai le credenziali dell'utente, non ho testato questo scenario da solo.
Sfortunatamente ServerXMLHTTP fornisce un accesso molto limitato ai dettagli di configurazione su WinHTTP. Tuttavia, se si tratta di un blocco dello spettacolo, è sempre possibile utilizzare direttamente il componente 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
Dovrebbe funzionare per http, per https diventa davvero disordinato.