creare un post http dal server utilizzando le credenziali dell'utente - sicurezza integrata

StackOverflow https://stackoverflow.com/questions/1046513

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

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

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 ???

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top