24

パスワードで保護されている同じドメイン/同じasp.netアプリケーションのWebページにアクセスしようとしています。クレデンシャルは、この呼び出しを実行するWebページとアクセスされるWebページの両方で同じです。

これがコードですが、なぜいつもログインフォームの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");
}
4

1 に答える 1

56

アクセスしようとしているWebページがフォーム認証を使用していると思われます。これは、保護されたリソースにアクセスできるようにする場合は、有効な認証Cookieを提供する必要があることを意味します。また、有効な認証Cookieを取得するには、まず、Cookieを発行するログオンページにPOSTリクエストを送信して自分自身を認証する必要があります。Cookieを取得すると、保護されたリソースに対する後続のリクエストでCookieを送信できるようになります。WebClientまた、箱から出してすぐにCookieをサポートしていないことにも注意してください。このため、カスタムのCookie対応Webクライアントを作成できます。

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つのリクエストを実行できます。

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");
}

明らかに、ASP.NETのViewStateの不安定さのために、ログオン要求に沿って他のいくつかのパラメーターを送信する必要がある場合があります。できることは次のとおりです。Webブラウザーで認証し、FireBugを使用して、送信する必要のある正確なパラメーターとヘッダーを確認します。

于 2012-06-20T11:48:11.517 に答える