DOBON.NET DOBON.NETプログラミング掲示板過去ログ

WebClient Basic認証(ユーザ名が空)

環境/言語:[Microsoft Visual Studio 2008 Version 9.0.30729.1 SP Microsoft .NET Framework Version 3.5 SP1 / C#]
分類:[.NET]

ユーザ名が空でパスワードは設定されているWebサーバ(ルータ)へ
アクセスするプログラムを作成していますが、
400が帰ってきてしまいアクセスできません。

もし実装方法をぎ存知のかたがいらっしゃればご教授をお願いいたします。

--- ソースここから ---
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;

namespace get
{
    class Program
    {
        static int Main(string[] args)
        {
            WebClient wc = new WebClient();

            wc.Credentials = new System.Net.NetworkCredential("", "pass");

            wc.DownloadFile(
               "http://192.168.0.1/log.txt",
               "log.txt");

            wc.Dispose();

            return 0;
        }
    }
}
--- ソースここまで ---

なお、以下の2パターンでは正常動作を確認しました。
+ 認証がないページ
+ Basic認証でユーザ名とパスワードが設定されているページ
■No30324に返信(さとすけさんの記事)
未検証ですが、例えばNetworkCredentialインスタンス生成時、引数なしのコンストラクタを使うとどうなりますか?

wc.Credentials = new System.Net.NetworkCredential();
wc.Credentials.Password = "pass";
2012/04/16(Mon) 15:27:52 編集(投稿者)
2012/04/16(Mon) 15:27:45 編集(投稿者)

> 未検証ですが、例えばNetworkCredentialインスタンス生成時、引数なしのコンストラクタを使うとどうなりますか?

お返事ありがとうございます。
ご指摘の方法では、同じエラー(400)になってしまいました。

--- エラー内容 ---
リモート サーバーがエラーを返しました: (400) 要求が不適切です
--- エラー内容 ---

--- ソース抜粋 ---
NetworkCredential cr = new System.Net.NetworkCredential();
cr.Password = "pass";
wc.Credentials = cr;
--- ソース抜粋 ---
# wc.Credentials.Password = "pass";
 は文法エラーになってしまいましたため、
 上記のコードにてテストしました
■No30326に返信(さとすけさんの記事)
そうでしたか。残念。
それでは、NetworkCredentialの代わりに、CredentialCacheなど、同じICredentialsインタフェースを持つクラスで、認証方式を指定するとどうでしょうか。

http://msdn.microsoft.com/ja-jp/library/system.net.credentialcache(v=vs.80).aspx
■No30324に返信(さとすけさんの記事)
> 400が帰ってきてしまいアクセスできません。
どのようなリクエストが送出されているのか、
Fiddler 等で確認しておくと良いかも。
http://msdn.microsoft.com/ja-jp/library/bb250442.aspx


> もし実装方法をぎ存知のかたがいらっしゃればご教授をお願いいたします。
http://www.tt.rim.or.jp/~rudyard/torii009.html

Credentials は使わず、自前で認証ヘッダーを
付けてしまうというのは如何でしょう。

wc.Headers.Add("Authorization: Basic " +
 Convert.ToBase64String(Encoding.ASCII.GetBytes(user + ":" + password)));
ピポパさん、魔界の仮面弁士さんお返事ありがとうございました。

@自前で実装 ====================

> Credentials は使わず、自前で認証ヘッダーを
> 付けてしまうというのは如何でしょう。

無事アクセスできました!
とても貴重な情報ありがとうございます。

---修正版ソース---
wc.Headers.Add("Authorization: Basic " +
   Convert.ToBase64String(Encoding.ASCII.GetBytes(":" + "pass")));
wc.DownloadFile(
   "http://192.168.0.1/log.txt",
   "log.txt");
---修正版ソース---


@CredentialCache ====================

同じ400が帰ってしまいました。
ただ実装方法に問題があったかもしれません。
(WebClientは使わないのが正解?)
今後、少し探ってみたいと思います。

---ソース---
WebClient wc = new WebClient();

CredentialCache myCache = new CredentialCache();
myCache.Add(new Uri("http://192.168.0.1/log.txt"),
    "Basic",
    new NetworkCredential("", "pass"));
wc.Credentials = myCache;

wc.DownloadFile(
     "http://192.168.0.1/log.txt",
     "log.txt");
---ソース---


@Fiddler ====================

パケットキャプチャを実装するクラスでしょうか。
こちらも今後に生かせるように調査してみます。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板