Аутентификация Django из .NET с использованием HttpWebRequest и HttpWebResponse через HTTP POST - PullRequest
3 голосов
/ 17 декабря 2008

Я создаю приложение в .NET, которое будет служить вторым пользовательским интерфейсом для моего уже развернутого приложения Django. Для некоторых операций пользователи должны аутентифицировать себя (как пользователи Django). Я использовал супер-простой способ сделать это (без шифрования учетных данных для простоты): -

Шаг 1. Я создал представление django, которое приняло имя пользователя и пароль через два параметра HTTP GET и передало их в django.contrib.auth.authenticate () в качестве аргументов ключевого слова. Смотрите код ниже:

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

Шаг 2. Я назвал это, используя следующий код в .NET. 'StrAuthURL' в следующем представляет простой URL-адрес django, сопоставленный с представлением django выше:

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

Это работает безупречно, хотя это не более чем подтверждение концепции.

Теперь я хочу сделать это через HTTP POST, поэтому я сделал следующее: -

Я создал представление django для выполнения аутентификации с использованием данных 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

Сервер выдает мне 500 внутренняя ошибка сервера. Я предполагаю, что запрос POST неправильно настроен в .NET. Поэтому мне, по сути, нужны некоторые инструкции о том, как вызывать представление django из .NET для отправки POST-данных.

Спасибо, CM

Ответы [ 3 ]

2 голосов
/ 18 декабря 2008

Если вы не выполняете какой-либо сеанс обмена между двумя сайтами, а у сайта .Net есть доступ к БД приложения Django, вы можете аутентифицироваться прямо на БД. Этот вопрос о том, как перейти с Python на .Net, но он должен помочь вам, когда ваши хэши не совсем совпадают.

2 голосов
/ 17 декабря 2008

Выглядит нормально для меня. Я рекомендую использовать Wireshark, чтобы увидеть, что ваш restclient отправляет в заголовках, и посмотреть, что ваше приложение отправляет в заголовках.

0 голосов
/ 18 декабря 2008

Сейчас работает. Заголовки HTTP были в порядке, источником проблемы были следующие строки:

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

По сути, это приводило к потоку данных с нулевыми байтами между символьными байтами. Это, конечно, не то, что ожидает аутентификация Django в параметрах. Переход на ASCIIEncoding решил проблему.

> Выглядит нормально для меня. Я рекомендую использовать Wireshark, чтобы увидеть, что ваш restclient отправляет в заголовках и посмотреть, что ваше приложение отправляет в заголовках.

Это поставило меня на правильный путь к устранению неполадок. Я попытался с Wireshark, но затем использовал HTTP Debugger, который казался более подходящим для этой работы.

Правильные инструменты могут сэкономить один час!

...