3

ユーザー名/パスワードを使用して Web サイトからファイルをダウンロードしようとしています。ファイルをダウンロードするには、登録済みアカウントの料金を支払う必要があります。ユーザー名/パスワードを渡して、次のようにファイルをダウンロードしようとしています:

if (docUrl != null)
            {
                if (!string.IsNullOrEmpty(username) && !string.IsNullOrEmpty(password))
                    this.WebClientInstance.Credentials = new NetworkCredential(username, password);

                fileData = this.WebClientInstance.DownloadData(docUrl);
                this.WebClientInstance.Dispose();
                isDataDownloaded = true;
            }

WebClientInstance は System.Net.WebClient です。資格情報を設定するための行に到達していることをデバッグして確認しました。PDF をダウンロードする代わりに、ファイルにアクセスするためにログインするように求める HTML ページが表示されます。ユーザー名/パスワードが正しいことを確認しました。同じ資格情報を使用して、WatiN で Web サイトをスクレイピングします。

私がここでやるべきことは他にありますか?

アップデート

さて、私はいくつかのスニッフィングを行い、この問題に関するいくつかの有用な情報を見つけました. 私はまだそれを機能させていませんが、私は近づいていると思います。まず、次のように、WebClient クラスを拡張する Cookie 対応の WebClient を作成する必要があります。

public class CookiesAwareWebClient : WebClient
{
    public CookieContainer CookieContainer { get; private set; }

    public CookiesAwareWebClient()
    {
        this.CookieContainer = new CookieContainer();
    }

    protected override WebRequest GetWebRequest(Uri address)
    {
        var webRequest = base.GetWebRequest(address);

        if (webRequest is HttpWebRequest)
            (webRequest as HttpWebRequest).CookieContainer = this.CookieContainer;

        return webRequest;
    }
}

次に、WebClient.UploadValues() メソッドを使用して、ログイン情報をターゲット Web サイトにアップロードします。ターゲット リソースの認証とダウンロードの完全なプロセスは次のとおりです。

using (var webClient = new CookiesAwareWebClient())
                    {
                        var postData = new NameValueCollection()
                        {
                            { "userId", username },
                            { "password", password }
                        };

                        webClient.UploadValues(docUrl, postData);

                        fileData = webClient.DownloadData(docUrl);
                    }

フォーム認証を使用しているサイトについて間違っていました。これは JSP Web サイトであり、JSESSIONID を使用します。有効な 32 バイトの JSESSIONID 値と思われる Cookie が返されることを確認しました。

ただし、 WebClient.DownloadData() を呼び出すと、リダイレクトされたログイン ページのみが返されます。HttpWebRequest の AllowAutoRedirect プロパティを false に設定してこれを修正しようとしましたが、0 バイトが返されます。

リダイレクトされず、認証後にリソースに移動するようにするには、他に何かする必要がありますか?

4

1 に答える 1

0

(質問の編集で回答。コミュニティ wiki の回答に変換。回答がない質問を参照してください。ただし、コメントで問題が解決されました (またはチャットで拡張) )

OP は次のように書いています。

解決しました。だから問題は私の耳の間でした。セキュアなリソースの URL を .UploadValues() メソッドに渡していたので、ログイン ページにリダイレクトされることがわかっていました。ただし、ログインページ自体ではなく、ログインフォーム (送信時に送信される場所) から URL を渡す必要がありました。それをしたら、正しく動作しました。私はこれからフードサービスの仕事を探しに行こうと思っています。

リンク

この問題に対処する SO に投稿されたいくつかの質問が既にありました。最初は何を探しているのかわからなかったので、それらが表示されませんでした... この問題に取り組んでいるときに出会ったいくつかの優れたリソースがここにあります。

asp.netの2つのURLの間にCookieを維持する方法

HttpWebRequest を使用して認証 Cookie を取得しようとしています

于 2015-02-03T16:59:54.527 に答える