Pergunta

Estou criando uma aplicação em .NET, que servirá como uma segunda interface do usuário para meu aplicativo Django já implantado. Para algumas operações os usuários precisam se autenticar (como usuários Django). Eu usei uma forma super-simples de fazer isso (sem criptografia de credenciais para simplificar): -

Passo 1. Eu criei uma visão Django que aceitou o nome de usuário e senha através de dois parâmetros HTTP GET e passou-as para django.contrib.auth.authenticate () como argumentos. Veja o código abaixo:

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

Passo 2. Eu chamei isso usando o seguinte código no .NET. O 'strAuthURL' nos seguintes representes um simples Django URL mapeadas para a visão django acima:

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

Isso funciona perfeitamente, embora seja nada mais do que uma prova de conceito.

Agora eu quero fazer isso via HTTP POST assim que eu fiz o seguinte: -

Eu criei uma visão django para a autenticação fazendo uso de dados 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

O servidor está me dando um erro interno do servidor 500. Meu palpite é que o pedido POST não está configurado corretamente no .NET. Então eu basicamente precisar de alguma orientação sobre como chamar a visão django de .NET enviar dados POST.

Obrigado, CM

Foi útil?

Solução

Looks ok para mim. Eu recomendo usar o Wireshark para ver o que seu restclient está enviando nos cabeçalhos e e ver o que seu aplicativo de envio nos cabeçalhos.

Outras dicas

Se você não está fazendo qualquer sessão de partilha entre os dois locais e o site Net tem acesso a DB do Django app que você pode autenticar diretamente contra o db. Este pergunta é sobre como ir de Python para .Net, mas deve ajudá-lo quando seus hashes não correspondem exatamente up.

Ele está trabalhando agora. Os cabeçalhos HTTP foram OK, a fonte do problema eram as seguintes linhas:

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

Essencialmente, este foi resultando em um fluxo de dados com bytes nulos entre os bytes de caracteres. Isso, claro, não é o que espera de autenticação Django nos parâmetros. Mudar para ASCIIEncoding resolveu o problema.

> parece OK para mim. Eu recomendo usar o Wireshark para ver o que seu restclient está enviando nos cabeçalhos e e ver o que seu aplicativo de envio nos cabeçalhos.

Este conjunto me fora no caminho certo para solucionar esse. Eu tentei com Wireshark, mas, em seguida, usado HTTP Debugger que parecia mais adequado para o trabalho.

As ferramentas certas pode salvar uma hora!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top