Question

Je suis en train de créer une application .NET qui servira une seconde interface utilisateur pour mon application Django déjà déployé. Pour certains utilisateurs les opérations doivent s'authentifier (comme les utilisateurs de Django). J'ai utilisé un moyen ultra-simple à faire (sans chiffrer les informations d'identification pour la simplicité): -

Étape 1. J'ai créé une vue django qui a accepté le nom d'utilisateur et mot de passe par deux paramètres HTTP GET et les a transmis à django.contrib.auth.authenticate () comme arguments de mot-clé. Voir le code ci-dessous:     

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

Etape 2. J'appelle cela en utilisant le code suivant dans .NET. Le « strAuthURL » dans le representes suite à une URL simple de django mappé à la vue django ci-dessus:     

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

Cela fonctionne parfaitement, bien qu'il ne soit rien de plus qu'une preuve de concept.

Maintenant, je veux le faire via HTTP POST, donc je l'ai fait ce qui suit: -

J'ai créé une vue django pour l'authentification à faire en utilisant les données 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

Le serveur me donne une erreur 500 interne du serveur. Je pense que la requête POST n'est pas correctement configuré dans .NET. Donc, je fondamentalement besoin de quelques conseils sur la façon d'appeler la vue django de .NET envoyer des données POST.

Merci, CM

Était-ce utile?

La solution

ok Attend pour moi. Je recommande d'utiliser Wireshark pour voir ce que votre restclient envoie dans les en-têtes et voir ce que votre application d'envoyer dans les en-têtes.

Autres conseils

Si vous ne faites aucun partage de session entre les deux sites et le site .Net a accès, vous pouvez directement à la authentifient DB de l'application Django contre la db. Ce question sur la façon d'aller de Python pour .Net mais il devrait vous aider lorsque vos hash ne correspondent pas exactement.

Il travaille maintenant. Les en-têtes HTTP étaient OK, la source du problème étaient les lignes suivantes:    

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

Pour l'essentiel, cela a été traduit par un flux de données avec des octets nuls entre les octets de caractères. Ce n'est évidemment pas ce que l'authentification Django attend dans les paramètres. Le passage à ASCIIEncoding a résolu le problème.

> Tout semble correct pour moi. Je recommande d'utiliser Wireshark pour voir ce que votre restclient envoie dans les en-têtes et voir ce que votre application d'envoyer dans les en-têtes.

Cela me partit sur le bon chemin vers la résolution de ce. J'ai essayé avec Wireshark, mais ensuite utilisé HTTP Debugger qui semblait plus adapté pour le travail.

Les bons outils peuvent économiser une heure!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top