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?

War es hilfreich?

Lösung

Versuche dies

ai = NTLMAuthenticationInfo("domain", "your host", "user", "password")
result = request101.GET('/')
result = NTLMAuthentication(result, request101, ai)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top