ダイジェスト http 認証を使用するスクレイピング Web サイトをスクリーニングする方法を知っている人はいますか? 私は次のようなコードを使用します:
var request = (HttpWebRequest)WebRequest.Create(SiteUrl);
request.Credentials=new NetworkCredential(Login, Password)
サイトのメインページにはアクセスできますが、(同じ認証情報で別のリクエストを使用して) 他のページに移動しようとすると、「HTTP/1.1 400 Bad Request」エラーが発生します。
Fiddler を使用して、C# アプリケーションのリクエストと Mozilla Firefox のリクエストを比較しました。
私がアクセスしようとしている 2 つの URL は 次のとおり です。
私の C# アプリの 2 つの要求 () は次のとおりです。
Authorization: Digest username="xxx",realm="abc",nonce="NXa26+NjBAA=747dfd1776c9d585bd388377ef3160f1ff265429",uri="/forum/index.php",algorithm="MD5",cnonce="89179bf17dd27785aa1c88ad976817c9",nc=00000001,qop="auth",response="3088821620d9cbbf71e775fddbacfb6d"
Authorization: Digest username="xxx",realm="abc",nonce="1h7T6+NjBAA=4fed4d804d0edcb54bf4c2f912246330d96afa76",uri="/forum/viewforum.php",algorithm="MD5",cnonce="bb990b0516a371549401c0289fbacc7c",nc=00000001,qop="auth",response="1ddb95a45fd7ea8dbefd37a2db705e3a"
そして、それが Firefox がサーバーに送信するものです。
Authorization: Digest username="xxx", realm="abc", nonce="T9ICNeRjBAA=4fbb28d42db044e182116ac27176e81d067a313c", uri="/forum/", algorithm=MD5, response="33f29dcc5d70b61be18eaddfca9bd601", qop=auth, nc=00000001, cnonce="ab96bbe39d8d776d"
Authorization: Digest username="xxx", realm="abc", nonce="T9ICNeRjBAA=4fbb28d42db044e182116ac27176e81d067a313c", uri="/forum/viewforum.php?f=4&sid=d104363e563968b4e4c07e04f4a15203", algorithm=MD5, response="a996dae9368a79d49f2f29ea7a327cd5", qop=auth, nc=00000002, cnonce="e233ae90908860e1"
したがって、私のアプリでは「ノンス」フィールドに異なる値がありますが、Firefox ではこのフィールドは同じです。一方、Firefoxがこのフィールドをインクリメントしている間、「nc」フィールドには同じ値があります。
また、アプリが Fiddler のサイト ページにアクセスしようとすると、常に "HTTP/1.1 401 Authorization Required" という応答が返されるのに対し、Firefox は 1 回しか承認されないことがわかります。request.PreAuthenticate = true; を設定しようとしました。でも効果はないようです…
私の質問は、C# を使用してダイジェスト認証を適切に実装する方法ですか? 標準的な方法はありますか、それともゼロから行う必要がありますか? 前もって感謝します。