2015-09-18 4 views
0

У меня возникла проблема с получением пены для аутентификации с использованием пакета python-ntlm на сайте SharePoint 2010. Я пробовал решения, связанные с this thread без везения.Suds throwing 403 Запрещено на SharePoint

Я запускаю Python 2.7.10, suds 0.4 и python-ntlm 1.1.0.

Вот мой код:

from suds.client import * 
from suds.transport.https import WindowsHttpAuthenticated 

import logging 
logging.basicConfig(level=logging.INFO) 
logging.getLogger('suds.client').setLevel(logging.DEBUG) 
logging.getLogger('suds.transport').setLevel(logging.DEBUG) 
logging.getLogger('ntlm').setLevel(logging.DEBUG) 

url = "https://web.site.com/sites/Collection/_vti_bin/Lists.asmx?WSDL" 
ntlm = WindowsHttpAuthenticated(username='DOMAIN\UserName', 
           password='Password') 
client = Client(url, transport=ntlm) 
client.service.GetListCollection() 

Вот отладочный вывод:

DEBUG:suds.transport.http:opening (https://web.site.com/sites/Collection/_vti_bin/Lists.asmx?WSDL) 
DEBUG:suds.transport.http:opening (http://www.w3.org/2001/XMLSchema.xsd) 
DEBUG:suds.transport.http:opening (http://www.w3.org/2001/xml.xsd) 
DEBUG:suds.client:sending to (https://web.site.com/sites/Collection/_vti_bin/Lists.asmx) 
message: 
<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Header/> 
    <ns0:Body> 
     <ns1:GetListCollection/> 
    </ns0:Body> 
</SOAP-ENV:Envelope> 
DEBUG:suds.client:headers = {'SOAPAction': u'"http://schemas.microsoft.com/sharepoint/soap/GetListCollection"', 'Content-Type': 'text/xml; charset=utf-8'} 
DEBUG:suds.transport.http:sending: 
URL:https://web.site.com/sites/Collection/_vti_bin/Lists.asmx 
HEADERS: {'SOAPAction': u'"http://schemas.microsoft.com/sharepoint/soap/GetListCollection"', 'Content-Type': 'text/xml; charset=utf-8', 'Content-type': 'text/xml; charset=utf-8', 'Soapaction': u'"http://schemas.microsoft.com/sharepoint/soap/GetListCollection"'} 
MESSAGE: 
<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"><SOAP-ENV:Header/><ns0:Body><ns1:GetListCollection/></ns0:Body></SOAP-ENV:Envelope> 
ERROR:suds.client:<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Header/> 
    <ns0:Body> 
     <ns1:GetListCollection/> 
    </ns0:Body> 
</SOAP-ENV:Envelope> 
DEBUG:suds.client:http failed: 
403 FORBIDDEN 
Traceback (most recent call last): 
    File "C:/Users/username/PycharmProjects/Suds/soap.py", line 14, in <module> 
    client.service.GetListCollection() 
    File "C:\Python27\lib\site-packages\suds\client.py", line 542, in __call__ 
    return client.invoke(args, kwargs) 
    File "C:\Python27\lib\site-packages\suds\client.py", line 602, in invoke 
    result = self.send(soapenv) 
    File "C:\Python27\lib\site-packages\suds\client.py", line 649, in send 
    result = self.failed(binding, e) 
    File "C:\Python27\lib\site-packages\suds\client.py", line 708, in failed 
    raise Exception((status, reason)) 
Exception: (403, u'Forbidden') 

Однако эквивалент отлично работает в CURL (отформатирован для удобства чтения)

curl -u 'Username':'Password' --ntlm -X POST \ 
-H 'Content-Type: text/xml'\ 
-H 'SOAPAction: "http://schemas.microsoft.com/sharepoint/soap/GetListCollection"' \ 
"https://web.site.com/sites/Collection/_vti_bin/Lists.asmx" \ 
--data-binary @soapenvelope.xml 

Я также не смогли найти способ заставить пенообразования работать через прокси-сервер Fiddler, а также пропустить NTLM a uthentication. Обрисованный here, он все равно игнорирует настройки прокси, и я не могу найти способ смешать и сопоставить локальный прокси через fiddler и попытаться установить аутентификацию NTLM на веб-службу Списки.

экологической информации (сделать это легко для поиска):

  • SharePoint 2010
  • основе форм аутентификации/FedAuth
  • Внешний Oracle SSO с использованием SAML v1.x

ответ

1

После good amount of reading for the NTLM protocol , Я выяснил, что cURL отправляет сообщение NTLM Type 1 на запрос первый. Однако пена (и PowerShells 'New-WebServiceProxy) этого не делала. Он получал 403 Forbidden, но не выполнял процесс рукопожатия, так как это было неожиданным. Используя create_NTLM_NEGOTIATE_MESSAGE() в python-ntlm3, я смог сгенерировать это сообщение типа 1.

Добавив заголовок «Авторизация» с сообщением «Тип 1», что вынудило 401 «Несанкционированное» и вызвало WindowsHttpAuthenticated для завершения рукопожатия, как ожидалось.

from ntlm3 import ntlm 
from suds.client import Client 
from suds.transport.https import WindowsHttpAuthenticated 

url = "https://web.site.com/sites/Collection/_vti_bin/Lists.asmx" 
wsdl = (url + "?WSDL") 
domain = 'DOM' 
username = 'USER' 
password = 'PASS' 

transport = WindowsHttpAuthenticated(username=username, 
            password=password) 
client = Client(url=wsdl, 
       location=url, 
       transport=transport) 

negotiate = "%s\\%s" % (domain, username) 
ntlmauth = 'NTLM %s' % ntlm.create_NTLM_NEGOTIATE_MESSAGE(negotiate).decode('ascii') 
header = {'Authorization': ntlmauth} 
client.set_options(headers=header) 
client.service.GetList('Test') 

Волшебная причина, по которой все это происходит, заключается в том, что мы используем аутентификацию на основе форм (FBA). Обычные запросы на аутентификацию передаются в Oracle SSO, поэтому (я считаю) он не отвечает нормально и вызывает 403 Unauthorized.

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