Verwenden von jcifs in Jython, um mit NTLM-Sicherheit auf die Site zuzugreifen
Frage
Seit einiger Zeit versuche ich, eine Möglichkeit für Jython zu finden, über NTLM auf die Site zuzugreifen.Ich habe nur Grundkenntnisse in Python und so gut wie keine in Java, daher könnte ich Hilfe (oder ein Beispiel) gebrauchen, wie ich die Anforderung in diesem Skriptteil, den ich gefunden habe, NTLM verwenden kann.Ich verwende dies mit einer Open-Source-Anwendungsmühle.
Zuerst beginne ich mit dem Importieren von JCIFs im Skript zusammen mit anderen, die von Grinder verwendet werden:
from net.grinder.script import Test
from net.grinder.script.Grinder import grinder
from net.grinder.plugin.http import HTTPPluginControl, HTTPRequest
from HTTPClient import NVPair
from jcifs.ntlmssp import Type1Message
from jcifs.ntlmssp import Type2Message, Type3Message
from jcifs.util import Base64
Dieser Codeteil wurde in einem Beispiel bereitgestellt, das ich gefunden habe.Es war das Beste, was ich finden konnte und das meinen Bedürfnissen entsprach, da ich nur die vollständige Antwort auf die Anfrage erhalten muss.
def NTLMAuthentication1(url, request, info, NTLMfield):
token_type1 = info.token_type1()
params = (NVPair("Authorization", "NTLM "+token_type1), )
result = request.GET(url, None, params)
NTLMfield = result.getHeader("WWW-Authenticate")
return NTLMAuthentication2(url, request, info, NTLMfield)
def NTLMAuthentication2(url, request, info, NTLMfield):
if NTLMfield.startswith("Negotiate"):
token_type2 = NTLMfield[len("Negotiate "):]
else:
token_type2 = NTLMfield[5:]
token_type3 = info.token_type3(token_type2)
params = (NVPair("Cookie", "WSS_KeepSessionAuthenticated=80"),
NVPair("Authorization", "NTLM " + token_type3), )
result = request.GET(url, None, params)
return result
# this function validate request and its result to see if the NTLM authentication is required
def NTLMAuthentication(lastResult, request, info):
# get last http request's url
url = lastResult.getEffectiveURI().toString()[len(request.getUrl()):]
# The result is ask for authentication
if lastResult.statusCode != 401 and lastResult.statusCode != 407:
return lastResult
NTLMfield = lastResult.getHeader("WWW-Authenticate")
if NTLMfield == None:
return lastResult
# check it is the first shakehands
if NTLMfield == "Negotiate, NTLM" or NTLMfield == "NTLM":
return NTLMAuthentication1(url, request, info, NTLMfield)
# check it is the second shakehands
elif len(NTLMfield) > 4 and NTLMfield[:4] == "NTLM":
return NTLMAuthentication2(url, request, info, NTLMfield)
else:
return lastResult
class NTLMAuthenticationInfo:
def __init__(self, domain, host, user, passwd):
self.domain = 'domain'
self.host = 'host'
self.user = 'user'
self.passwd = 'password'
def token_type1(self):
msg = Type1Message(Type1Message.getDefaultFlags(), self.domain, self.host)
return Base64.encode(msg.toByteArray())
def token_type3(self, token_type2):
msg2 = Type2Message(Base64.decode(token_type2))
#if jcifs 1.3.7 using msg3 = Type3Message(msg2, self.passwd, self.domain, self.user, self.host)
msg3 = Type3Message(msg2, self.passwd, self.domain, self.user, self.host)
return Base64.encode(msg3.toByteArray())
Im Hauptteil sieht die Anfrage etwa so aus:
result = request101.GET('/')
Dabei wurde request101 mit URL und Header vordefiniert.Im Grunde habe ich also keine Ahnung, wie ich das umsetzen soll
Ich habe das versucht
result = request101.GET('/')
print str(NTLMAuthentication(result, request101, NTLMAuthenticationInfo))
sowie genau das
NTLMAuthentication(request101.GET('/'), request101, NTLMAuthenticationInfo)
aber keines davon hat funktioniert.Irgendwelche Tipps, wie man das ausführt?
Lösung
Versuche dies
ai = NTLMAuthenticationInfo("domain", "your host", "user", "password")
result = request101.GET('/')
result = NTLMAuthentication(result, request101, ai)