对 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.
这个问题既容易回答又不够具体,无法提供多种解决方案。
您可以使用 python
或 php
而不是纯 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
命令生成的每个进程都需要新的身份验证。
情况:
我们公司有 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.
这个问题既容易回答又不够具体,无法提供多种解决方案。
您可以使用 python
或 php
而不是纯 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
命令生成的每个进程都需要新的身份验证。