Django Autenticazione dal .NET utilizzando HttpWebRequest e HttpWebResponse tramite HTTP POST
-
22-08-2019 - |
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
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!