对 IIS 服务器的几个 curl 请求,但一个授权

Several curl requests, but one authorization, to IIS server

情况:

我们公司有 IIS Server 和 MVC 网站,还有很多 Web api 控制器。这些控制器中的方法需要 Active Directory 帐户的授权。我们还有几台 Linux 机器。

在我的示例中,我将 curl 用于 Windows。

我们需要编写脚本,它向服务器发出大量请求(从网站获取信息并向其发送 post 文件,无论我们得到什么)。

当我尝试授权时一切正常。服务器询问密码,我得到正确答案:

PS C:\Users\Dent> curl.exe --url http://localhost:32060/website/api/controller/get --ntlm --user Domain\Dent

问题: 有没有办法只授权一次?这是一个关键时刻。我尝试了很多变化:

PS C:\Users\Dent> curl.exe --url http://localhost:32060/website/api/controller/get --ntlm --user Domain\Dent  --cookie cookies.txt --cookie-jar newcookies.txt

PS C:\Users\Dent> curl.exe --url http://localhost:32060/website/api/controller/get --ntlm  --cookie cookies.txt --cookie-jar newcookies.txt

PS C:\Users\Dent> curl.exe --url http://localhost:32060/website/api/controller/get --ntlm --user Domain\Dent  --cookie cookies.txt --cookie-jar newcookies.txt

PS C:\Users\Dent> curl.exe --url http://localhost:32060/website/api/controller/get --ntlm --user Domain\Dent -H 'Authorization: NTLM lRMTVNTUAADAAAAGAAYAIQAAABEAUQBnAAAAAYABgBYAAAAEAAQAF4AAAAWABYAbgAAAAAAAADgAQAAYKIogYDgCUAAAAP4ygBdAhHiKi2LEuSRfJ6eWMAYwByAGUAYgB5AGsAaABvAHYAdABOAFMAVABJAEMATABFFcANgA1ADQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARTb7bLPYzubYSW6GuyvXPQEBAAAAAAAAXdqVJs470AEZcpe38rRYpQAAAAACAAYAQwBDAFIAAQAWAE4AUwBUAEkAQwMAEUAVwA2ADUANAAEACQAYwBjAHIALgBjAG8AcgBwAC4AaQBuAHQAZQBsAC4AYwBvAG0AAwA8AG4AcwB0AGkAYwBsAGUAdwA2ADUANAAuAGMAYwByAC4AYwvAHIAcAAuAGkAbgB0AGUAbAAuAGMAbwBtAAUAHABjAG8AcgBwAC4AaQBuAHQAZQBsAC4AYwBvAG0ABwIAF3alSbOO9ABBgAEAAIAAAAIADAAMAAAAAAAAAAAAAAAACAAALh41JFVReGhOYD25+oWLEmoV6Rii9744yJRoVnACRWCgAQAAAAAAAAAAAAAAAAAAAAAAAJAAAAAAAAAAAAAAAAAAAA' 

而且没有任何进展。

在 powershell 中看起来很简单:

$session = ''
Invoke-WebRequest -SessionVariable session -Uri http://localhost:32060/website/api/controller/get -Credential Domain\Dent

#In second request we use the same session variable and no credentials needed. 

Invoke-WebRequest -WebSession $session -Uri http://localhost:32060/website/api/controller/get/2

我需要为我们的 Linux 团队提供一些工作示例。两天的谷歌搜索,没有任何进展。有一个晚上,但我还在办公室=) 请帮忙!

这里隐含的一个问题是“如何在 bash 中跟踪 NTLM HTTP 会话?”,其方式类似于使用 PowerShell 会话完成的方式变量。

然而真正的问题是

Question: I need to present some working example for our Linux-team.

这个问题既容易回答又不够具体,无法提供多种解决方案。

您可以使用 pythonphp 而不是纯 shell 和 curl

在 Python 中使用 requests (Requests: HTTP for Humans) 和 requests_ntlm 库,您可以按以下方式进行交互:

>>> import requests
>>> from getpass import getpass
>>> from requests_ntlm import HttpNtlmAuth
>>> username='Domain\Dent'
>>> password=getpass()
Password:
>>> s = requests.Session()
>>> s.auth = HttpNtlmAuth(username,password)
>>> r1 = s.get('http://localhost:32060/website/api/controller/get')
>>> r1.status_code
200
>>> r2 = s.get('http://localhost:32060/website/api/controller/get/2')
>>> r2.status_code
200

您对会话进行一次身份验证,以后无需再次输入密码即可发出许多请求。

Question: Is there a way to authorize only once (using curl command)?

不,这是不可能的。 Windows Challenge/Response 身份验证基于连接安全模型。 NTLM 在一个 TCP 连接内协商请求的身份验证。 Cookie 不包含所有必要的安全令牌。不可能在两个不相关的进程之间共享 TCP 连接,因此使用 curl 命令生成的每个进程都需要新的身份验证。