3

既にデプロイされている Django アプリの 2 番目の UI として機能するアプリケーションを .NET で作成しています。一部の操作では、ユーザーは自分自身を認証する必要があります (Django ユーザーとして)。これを行うには、非常に簡単な方法を使用しました(簡単にするために資格情報を暗号化せずに):-

ステップ 1. 2 つの HTTP GET パラメーターを介してユーザー名とパスワードを受け取り、それらをキーワード引数として django.contrib.auth.authenticate() に渡す django ビューを作成しました。以下のコードを参照してください。

    def authentication_api (リクエスト、raw_1、raw_2):
        ユーザー = 認証 (ユーザー名 = raw_1、パスワード = raw_2)
        ユーザーが None でない場合:
            user.is_active の場合:
                return HttpResponse("正しい", mimetype="text/plain")
            そうしないと:
                return HttpResponse("disabled", mimetype="text/plain")
        そうしないと:
            return HttpResponse("正しくない", mimetype="text/plain")

ステップ 2. .NET で次のコードを使用してこれを呼び出しました。次の「strAuthURL」は、上記の Django ビューにマップされた単純な Django URL を表しています。

    Dim request As HttpWebRequest = CType(WebRequest.Create(strAuthURL), HttpWebRequest)
    薄暗い応答として HttpWebResponse = CType(request.GetResponse(), HttpWebResponse)
    Dim リーダー As StreamReader = New StreamReader(response.GetResponseStream())
    文字列として薄暗い結果 = reader.ReadToEnd()
    HttpWResp.Close()

これは概念実証にすぎませんが、問題なく動作します。

これをHTTP POST経由で実行したいので、次のことを行いました: -

POSTデータを使用して認証を行うためのdjangoビューを作成しました

    def post_authentication_api (リクエスト):
        request.method == 'POST' の場合:
            user = authenticate(username=request.POST['username'], password=request.POST['password'])
            ユーザーが None でない場合:
                user.is_active の場合:
                    return HttpResponse("正しい", mimetype="text/plain")
                そうしないと:
                    return HttpResponse("disabled", mimetype="text/plain")
            そうしないと:
                return HttpResponse("正しくない", 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 エンコーディング As New UnicodeEncoding
    Dim postData As String = "username=" & m_username & "&password=" & m_password
    Dim postBytes As Byte() = encoding.GetBytes(postData)
    request.ContentLength = postBytes.Length
    試す
        Dim postStream As Stream = request.GetRequestStream()
        postStream.Write(postBytes, 0, postBytes.Length)
        postStream.Close()
        薄暗い応答として HttpWebResponse = CType(request.GetResponse(), HttpWebResponse)
        Dim responseStream As New StreamReader(response.GetResponseStream(), UnicodeEncoding.Unicode)
        結果 = responseStream.ReadToEnd()
        response.Close()
    ex を例外としてキャッチ
        MessageBox.Show(ex.ToString)
    エンドトライ

サーバーから 500 内部サーバー エラーが発生しました。私の推測では、.NET で POST 要求が適切に設定されていません。したがって、POST データを送信する .NET から django ビューを呼び出す方法について、基本的にガイダンスが必要です。

ありがとう、CM

4

3 に答える 3

2

私には大丈夫に見えます。Wireshark を使用して、restclient がヘッダーで何を送信しているかを確認し、アプリがヘッダーで何を送信しているかを確認することをお勧めします。

于 2008-12-17T05:26:13.507 に答える
2

2 つのサイト間でセッション共有を行っておらず、.Net サイトが Django アプリの DB にアクセスできる場合は、DB に対して直接認証できます。 この質問は、Python から .Net に移行する方法に関するものですが、ハッシュが正確に一致しない場合に役立つはずです。

于 2008-12-17T22:45:38.153 に答える
0

それは今働いています。HTTP ヘッダーは問題ありませんでした。問題の原因は次の行でした。

    Dim エンコーディング As New UnicodeEncoding
    .
    Dim postBytes As Byte() = encoding.GetBytes(postData)

基本的に、これにより、文字バイト間に null バイトがあるデータ ストリームが発生していました。もちろん、これは Django 認証がパラメーターで期待するものではありません。ASCIIEncoding に変更すると問題が解決しました。

>私には大丈夫に見えます。Wireshark を使用して、restclient がヘッダーで何を送信しているかを確認し、アプリがヘッダーで何を送信しているかを確認することをお勧めします。

これにより、これをトラブルシューティングするための正しい道を歩むことができました。私は Wireshark を試してみましたが、その仕事により適していると思われる HTTP Debugger を使用しました。

適切なツールを使用すると、1 時間節約できます。

于 2008-12-17T23:24:45.733 に答える