19

私が発見したさまざまな記事 ( 12 ) により、これは十分に簡単に見えます。

WebRequest request = HttpWebRequest.Create(url);

var credentialCache = new CredentialCache();
credentialCache.Add(
  new Uri(url), // request url
  "Digest", // authentication type
  new NetworkCredential("user", "password") // credentials
);

request.Credentials = credentialCache;

ただし、これは URL パラメーターのない URL に対してのみ機能します。たとえば、問題なくダウンロードできますhttp://example.com/test/xyz.htmlが、ダウンロードしようとするhttp://example.com/test?page=xyzと、サーバーのログ (Apache 2.2 を実行) に次のような 400 Bad Request メッセージが表示されます。

Digest: uri mismatch - </test> does not match request-uri </test?page=xyz>

私の最初の考えは、ダイジェスト仕様ではダイジェスト ハッシュから URL パラメーターを削除する必要があるというものでしたが、渡された URL からパラメーターを削除してcredentialCache.Add()も何も変わりませんでした。そのため、逆である必要があり、.NET フレームワークのどこかで URL からパラメーターが誤って削除されています。

4

4 に答える 4

8

クエリ文字列パラメーターを削除したとのことですが、ホストだけに戻ってみましたか? 私が見た CredentialsCache.Add() のすべての例は、ホストのみを使用しているようであり、CredentialsCache.Add()のドキュメントには、Uri パラメーターが「uriPrefix」としてリストされているようです。

言い換えれば、これを試してください:

Uri uri = new Uri(url);
WebRequest request = WebRequest.Create(uri);

var credentialCache = new CredentialCache(); 
credentialCache.Add( 
  new Uri(uri.GetLeftPart(UriPartial.Authority)), // request url's host
  "Digest",  // authentication type 
  new NetworkCredential("user", "password") // credentials 
); 

request.Credentials = credentialCache;

これが機能する場合は、同じ「権限」をキャッシュに複数回追加しないようにする必要もあります...同じホストへのすべてのリクエストは、同じ資格キャッシュエントリを利用できるはずです。

于 2010-07-21T00:12:03.943 に答える
1

解決策は、Apache でこのパラメーターを有効にすることです。

    BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On 


詳細: http://httpd.apache.org/docs/2.0/mod/mod_auth_digest.html#msie

次に、webrequest オブジェクトのコードにこのプロパティを追加します。

    request.UserAgent = "MSIE"

それは私にとって非常にうまく機能します

于 2012-01-04T20:10:44.797 に答える
0

2 番目の URL は動的ページを指していると思います。最初に GET を使用して呼び出し、HTML を取得してからダウンロードする必要があります。ただし、この分野の経験はありません。

于 2010-07-18T20:47:06.690 に答える