Frage

ich eine Anwendung in .NET erschaffe, die als zweiten UI für meine bereits entfalteten Django App dienen. Für einige Operationen müssen die Benutzer sich authentifizieren (als Django Benutzer). Ich habe eine super-einfache Art und Weise, dies zu tun (ohne Anmeldeinformationen für Einfachheit Verschlüsselung): -

Schritt 1. Ich habe eine django Ansicht, die den Benutzernamen und das Passwort durch zwei HTTP-GET-Parameter akzeptiert und übergeben sie an django.contrib.auth.authenticate () als Keyword-Argumente. Siehe den folgenden Code:     

    def authentication_api(request, raw_1, raw_2):
        user = authenticate(username=raw_1, password=raw_2)
        if user is not None:
            if user.is_active:
                return HttpResponse("correct", mimetype="text/plain")
            else:
                return HttpResponse("disabled", mimetype="text/plain")
        else:
            return HttpResponse("incorrect", mimetype="text/plain")

Schritt 2. Ich nannte dies den folgenden Code in .NET. Die ‚strAuthURL‘ in der folgenden representes eine einfache django URL oben auf die django Ansicht abgebildet:     

    Dim request As HttpWebRequest = CType(WebRequest.Create(strAuthURL), HttpWebRequest)
    Dim response As HttpWebResponse = CType(request.GetResponse(), HttpWebResponse)
    Dim reader As StreamReader = New StreamReader(response.GetResponseStream())
    Dim result As String = reader.ReadToEnd()
    HttpWResp.Close()

Das funktioniert einwandfrei, obwohl es nicht mehr als ein Proof-of-concept ist.

Jetzt möchte ich dies über HTTP POST tun, damit ich getan habe folgendes: -

Ich habe eine django Ansicht für die Authentifizierung zu tun POST-Daten unter Verwendung von     

    def post_authentication_api(request):
        if request.method == 'POST':
            user = authenticate(username=request.POST['username'], password=request.POST['password'])
            if user is not None:
                if user.is_active:
                    return HttpResponse("correct", mimetype="text/plain")
                else:
                    return HttpResponse("disabled", mimetype="text/plain")
            else:
                return HttpResponse("incorrect", mimetype="text/plain")

I have tested this using restclient and this view works as expected. However I can't get it to work from the .NET code below:     

    Dim request As HttpWebRequest = CType(WebRequest.Create(strAuthURL), HttpWebRequest)
    request.ContentType = "application/x-www-form-urlencoded"
    request.Method = "POST"
    Dim encoding As New UnicodeEncoding
    Dim postData As String = "username=" & m_username & "&password=" & m_password
    Dim postBytes As Byte() = encoding.GetBytes(postData)
    request.ContentLength = postBytes.Length
    Try
        Dim postStream As Stream = request.GetRequestStream()
        postStream.Write(postBytes, 0, postBytes.Length)
        postStream.Close()
        Dim response As HttpWebResponse = CType(request.GetResponse(), HttpWebResponse)
        Dim responseStream As New StreamReader(response.GetResponseStream(), UnicodeEncoding.Unicode)
        result = responseStream.ReadToEnd()
        response.Close()
    Catch ex As Exception
        MessageBox.Show(ex.ToString)
    End Try

Der Server gibt mir einen 500 Interner Serverfehler. Meine Vermutung ist, dass die POST-Anforderung nicht richtig in .NET eingerichtet. Also brauche ich im Grunde einige Hinweise, wie die django Ansicht von .NET Senden POST-Daten nennen.

Danke, CM

War es hilfreich?

Lösung

Sieht für mich ok. Ich empfehle Wireshark, um zu sehen, was Ihr restclient in dem Header sendet und und sehe, was Ihre Anwendung in den Header senden.

Andere Tipps

Wenn Sie keine Sitzungsfreigabe zwischen den beiden Standorten tun und die .Net-Website hat Zugriff auf die Django App DB Sie gerade gegen die db authentifizieren können. Diese Frage ist, wie von Python zu .Net gehen, aber es sollte Ihnen helfen, wenn Ihr Hashes nicht genau zusammenpassen.

Es funktioniert jetzt. Die HTTP-Header waren OK, die Ursache des Problems waren die folgenden Zeilen:    

    Dim encoding As New UnicodeEncoding
    .
    Dim postBytes As Byte() = encoding.GetBytes(postData)

Wesentliches Dies wurde, was zu einem Datenstrom mit Null-Bytes zwischen dem Zeichenbytes. Das ist natürlich nicht das, was Django-Authentifizierung in den Parametern erwartet. Der Wechsel zu ASCIIEncoding wurde das Problem behoben.

> Sieht für mich ok. Ich empfehle Wireshark, um zu sehen, was Ihr restclient in dem Header sendet und und sehe, was Ihre Anwendung in den Header senden.

Dies setzt mich auf dem richtigen Weg aus dieser Richtung zur Fehlerbehebung. Ich habe versucht, mit Wireshark, aber dann verwendet HTTP Debugger, die für den Job geeignet schienen.

Die richtigen Werkzeuge können 1 Stunde sparen!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top