情况:
我们在公司和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团队提供一些工作示例。两天的谷歌搜索,没有进展。有一个晚上,但我还在办公室=) 请帮助!
答案 0 :(得分:1)
这里暗示的一个问题是“如何跟踪bash
中的NTLM HTTP会话?”,其方式与使用PowerShell会话变量的方式类似。
但真正的问题是
问题:我需要为我们的Linux团队提供一些工作示例。
这个问题更容易回答,而且不够具体,不允许多种解决方案。
您可以使用python
或php
代替curl
的纯shell。
在使用requests
(Requests: 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
命令生成的每个进程都需要新的身份验证。