パスワードで保護されている、同じドメイン / 同じ 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");
}
ベストアンサー1
アクセスしようとしている Web ページではフォーム認証が使用されていると思われます。つまり、保護されたリソースにアクセスするには、有効な認証 Cookie を提供する必要があります。有効な認証 Cookie を取得するには、まず Cookie を発行する LogOn ページに POST 要求を送信して認証する必要があります。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 を使用して、送信する必要のある正確なパラメータとヘッダーを確認します。