сделать HTTP-сообщение с сервера, используя учетные данные пользователя – встроенная безопасность
-
20-08-2019 - |
Вопрос
Я пытаюсь опубликовать сообщение со страницы сервера asp classic, используя учетные данные пользователя...
Я использую msxml2.ServerXMLHTTP для программного создания сообщения
Я пробовал использовать несколько конфигураций на сайте IIS 5.1, но я не могу запустить IIS с указанной учетной записью...
Я создал небольшую страницу asp, на которой запускается whoami, чтобы проверить, какую учетную запись использует процесс iis...
с IIS 5.1, используя встроенную безопасность, процесс использует:
моя_машина\IWAM_моя_машина
Я отключаю встроенную безопасность и оставляю учетную запись домена с анонимным доступом, и получаю то же самое (¿?)
чтобы проверить пользователя, я делаю следующее
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
это потому, что я даю команду оболочки?
Я хотел бы совершить почтовые HTTP-вызовы на другой сайт, который работает со встроенной безопасностью...
Поэтому мне нужен какой-то способ передать учетные данные или, по крайней мере, запустить с указанной учетной записью, а затем настроить удаленный сайт для передачи этой учетной записи...
Я думал, что просто настроить сайт на работу со встроенной безопасностью будет достаточно...
Как я могу достичь такого?
пс:С IIS6 происходит то же самое, но если я заменяю бассейн Canfiguration, я получаю следующую информацию от Whoami
NT AUTHORITY\СЕТЕВАЯ СЛУЖБА
NT AUTHORITY\МЕСТНАЯ СЛУЖБА
NT AUTHORITY\СИСТЕМА
если я устанавливаю учетную запись домена, я получаю сообщение «служба недоступна»...
редактировать:нашел это
он говорит то, что я предположил: «Если аутентифицированный пользователь делает запрос, токен потока основан на аутентифицированной учетной записи пользователя», но почему-то у меня это не работает...что мне может не хватать?
редактировать:
ну, эта штука с 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
конечная функция
и вроде все работало нормально...
но как заставить msxml2.ServerXMLHTTP работать с учетными данными пользователя???
Решение
Вы правы, whoami.exe вас сбил с толку.Запуск отдельного процесса приводил к тому, что новый процесс запускался от имени пользователя текущего процесса.В XP это будет хост приложения COM+ (DLLHOST), который обычно будет работать как IWAM_<machine>
.В IIS6 это рабочий процесс w3wp.exe, который обычно запускается как NT AUTHORITY
etwork 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 это становится очень запутанно.