Domanda

Sto creando un'applicazione in .NET che servirà come una seconda interfaccia utente per la mia già schierato Django app. Per alcune operazioni gli utenti devono autenticarsi (come utenti Django). Ho usato un modo super-semplice per farlo (senza crittografia delle credenziali per semplicità): -

Passaggio 1. Ho creato una vista Django che ha accettato il nome utente e la password attraverso due HTTP GET parametri e li ha trasmessi a django.contrib.auth.authenticate () come argomenti chiave. Vedere il codice qui sotto:     

    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")

Passaggio 2. Ho chiamato questo utilizzando il seguente codice in .NET. Il 'strAuthURL' nel seguente representes un semplice URL Django mappato alla vista django sopra:     

    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()

Questo funziona perfettamente, anche se non è niente più che un concetto proof-of-.

Ora voglio fare questo via HTTP POST così ho fatto quanto segue: -

Ho creato una vista Django per l'autenticazione fare utilizzando i dati POST     

    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

Il server mi sta dando un errore del server interno 500. La mia ipotesi è che la richiesta POST non è impostata correttamente in .NET. Così ho praticamente bisogno di alcune indicazioni su come chiamare la vista Django da NET invio di dati POST.

Grazie, CM

È stato utile?

Soluzione

Sembra ok per me. Mi consiglia di utilizzare Wireshark per vedere che cosa il vostro restclient sta inviando nelle intestazioni e e vedere che cosa la vostra applicazione inviando nelle intestazioni.

Altri suggerimenti

Se non si sta facendo ogni sessione di condivisione tra i due siti e il sito Net ha accesso a DB del Django app si potrebbe autenticarsi dritto contro il db. Questo domanda è su come andare da Python a .Net ma dovrebbe aiutare a quando i tuoi hash non corrispondono esattamente in su.

E 'ora di lavoro. Le intestazioni HTTP erano OK, la fonte del problema erano le seguenti righe:    

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

Essenzialmente, questo è stato come risultato un flusso di dati con byte nulli tra i byte di caratteri. Che ovviamente non è quello che l'autenticazione Django si aspetta nei parametri. La modifica al ASCIIEncoding risolto il problema.

> sembra OK per me. Mi consiglia di utilizzare Wireshark per vedere che cosa il vostro restclient sta inviando nelle intestazioni e e vedere che cosa la vostra applicazione inviando nelle intestazioni.

Questo mi partì sulla strada giusta verso la risoluzione di questo. Ho provato con Wireshark, ma poi usato Debugger HTTP che sembrava più adatto per il lavoro.

Gli strumenti giusti possono risparmiare un ora!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top