сделать HTTP-сообщение с сервера, используя учетные данные пользователя - встроенная защита - PullRequest
1 голос
/ 26 июня 2009

Я пытаюсь сделать сообщение со страницы сервера asp classic, используя учетные данные пользователя ...

Я использую msxml2.ServerXMLHTTP для программного создания поста

Я пытался использовать несколько конфигураций на сайте IIS 5.1, но я не могу заставить IIS работать с указанной учетной записью ...

Я сделал небольшую страницу asp, которая запускает whoami, чтобы проверить, какую учетную запись использует процесс 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

это потому что я запускаю команду оболочки?

Я хотел бы сделать http-звонки на другой сайт, который работает со встроенной защитой ...

Так что мне нужен какой-то способ передать учетные данные или, по крайней мере, запустить его с указанной учетной записью, а затем настроить удаленный сайт на использование этой учетной записи ...

Я думал, что достаточно просто настроить сайт для работы с интегрированной безопасностью ...

Как мне достичь такой цели?

ps: с IIS6 происходит то же самое но если я изменю конфигурацию пула, я получаю следующую информацию от whoami

NT AUTHORITY \ NETWORK SERVICE

NT AUTHORITY \ LOCAL SERVICE

NT AUTHORITY \ SYSTEM

если я установлю учетную запись домена, я получу сообщение "услуга недоступна" ...

редактировать: нашел это

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

он говорит то, что я предложил: «Если аутентифицированный пользователь делает запрос, токен потока основан на аутентифицированной учетной записи пользователя», но почему-то мне кажется, что я не работаю так ... что я мог сделать пропустить?

редактирование:

ну, что за штука, которая явно меня обманывает, я попробовал с помощью следующей функции


private function whoami_db( serverName, dbName )
dim conn, data</p>

<pre><code>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 работать с учетными данными пользователя ???

1 Ответ

1 голос
/ 27 июня 2009

Вы правы 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 это становится очень грязным.

...