2012-06-20 10 views
22

同じドメイン/同じasp.netアプリケーション上のWebページにアクセスしようとしています。つまり、パスワードで保護されています。この呼び出しとアクセスされているWebページの両方を起動するWebページでは、資格情報は同じです。WebClientが資格情報を持つページにアクセスしています

ここにコードがあります。なぜ私はいつもログインフォームのHTMLコードで終わるのですか?

using (WebClient client = new WebClient()) 
{ 
    client.QueryString.Add("ID", "1040"); //add parameters 
    //client.Credentials = CredentialCache.DefaultCredentials; 
    //I tried to add credentials like this 
    client.Credentials = new NetworkCredential("username", "password"); 

    string htmlCode = client.DownloadString("http://domain.loc/testpage.aspx"); 
} 
+0

なぜあなたは単にそのページにリダイレクトしていませんか?サーバープロセスでコードを使用してダウンロードすると、*同じ資格情報を使用していない*ことを意味します。私が正しく理解していれば、ブラウザに(クライアントの資格情報を使って)ページにアクセスするのではなく、別のマシン(サーバー)上の別のプロセスがそれをダウンロードしてクライアントに提示しています。 – shambulator

+0

これらの資格情報はどのようにWebページに提供されますか?フォーム認証を使用していますか? –

+0

@shambulatorそのページにリダイレクトするとどういう意味ですか?私はそのページのhtmlコードを取得しようとしています。 – mko

答えて

48

あなたがアクセスしようとしているWebページがフォーム認証を使用していると思われます。つまり、保護されたリソースにアクセスできるようにするには、有効な認証Cookieを提供する必要があります。また、有効な認証Cookieを取得するには、Cookieを発行するLogOnページにPOSTリクエストを送信して、最初に自分自身を認証する必要があります。 Cookieを取得すると、保護されたリソースに対する後続の要求に基づいてCookieを送信できます。また、WebClientの箱の外はクッキーをサポートしていないことに気づくべきです。原因ASP.NETのViewStateののcrapinessに明らかに

using (var client = new CookieAwareWebClient()) 
{ 
    var values = new NameValueCollection 
    { 
     { "username", "john" }, 
     { "password", "secret" }, 
    }; 
    client.UploadValues("http://domain.loc/logon.aspx", values); 

    // If the previous call succeeded we now have a valid authentication cookie 
    // so we could download the protected page 
    string result = client.DownloadString("http://domain.loc/testpage.aspx"); 
} 

public class CookieAwareWebClient : WebClient 
{ 
    public CookieAwareWebClient() 
    { 
     CookieContainer = new CookieContainer(); 
    } 
    public CookieContainer CookieContainer { get; private set; } 

    protected override WebRequest GetWebRequest(Uri address) 
    { 
     var request = (HttpWebRequest)base.GetWebRequest(address); 
     request.CookieContainer = CookieContainer; 
     return request; 
    } 
} 

は今、あなたは2つの要求をオフに解雇し、このクライアントを使用することができます。このような理由から、カスタムクッキーを認識し、Webクライアントを書くことができますログオン要求に沿っていくつかの他のパラメータを送信する必要があるかもしれません。あなたができることは次のとおりです。ウェブブラウザで認証し、送信する必要がある正確なパラメータとヘッダをFireBugで探します。

+0

ソリューションはきれいに見えます。ログインコレクションの名前は実際にユーザー名とパスワードにする必要がありますか?フォームベースの認証であるにもかかわらず、アプリケーションが現在の資格情報を使用する別の方法があります。 – mko

+0

@John、ログインの名前がユーザー名とパスワードである必要があるかどうかわかりません。これは、ログオンページの実装方法と、どのようなパラメータが必要なのかに完全に依存します。そして、いいえ、それ以外の方法はありません。有効なフォーム認証Cookieを取得する必要があります。そのようなCookieを取得する唯一の方法は、ログオンページに正しい資格情報を提供することです。フォーム認証Cookieを発行するのはこのページだけです(うまくいけば:-))。 –

+0

コードは機能しませんが、私はその考えを理解しています。 – mko

関連する問題