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

时间:2015-01-29 14:46:04

标签: asp.net iis curl asp.net-web-api

情况:

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

在我的示例中,我使用curl for Windows。

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

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

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团队提供一些工作示例。两天的谷歌搜索,没有进展。有一个晚上,但我还在办公室=) 请帮助!

1 个答案:

答案 0 :(得分:1)

这里暗示的一个问题是“如何跟踪bash中的NTLM HTTP会话?”,其方式与使用PowerShell会话变量的方式类似。

但真正的问题是

  

问题:我需要为我们的Linux团队提供一些工作示例。

这个问题更容易回答,而且不够具体,不允许多种解决方案。

您可以使用pythonphp代替curl的纯shell。

在使用requestsRequests: HTTP for Humans)和requests_ntlm库的Python中,您可以按以下方式进行交互式处理:

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

您可以对会话进行一次身份验证,之后可以在不再次输入密码的情况下发出许多请求。

  

问题:有没有办法只授权一次(使用curl命令)?

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