WebClient доступ к странице с учетными данными
Я пытаюсь получить доступ к веб-странице в том же домене / том же приложении asp.net, которое защищено паролем. Учетные данные одинаковы как для веб-страницы, вызывающей этот вызов, так и для веб-страницы, к которой осуществляется доступ.
Вот код, и я не знаю, почему я всегда получаю 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 ответ
Я подозреваю, что веб-страница, к которой вы пытаетесь получить доступ, использует проверку подлинности с помощью форм. Это означает, что вам нужно будет предоставить действительный файл cookie аутентификации, если вы хотите иметь доступ к защищенным ресурсам. И для того, чтобы получить действительный куки-файл аутентификации, вы должны сначала пройти аутентификацию, отправив запрос POST на страницу входа в систему, которая испускает куки-файл. После того, как вы получите файл cookie, вы сможете отправить его вместе с последующими запросами на защищенные ресурсы. Вы также должны заметить, что из коробки WebClient
не поддерживает куки. По этой причине вы можете написать собственный веб-клиент с поддержкой cookie:
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");
}
Очевидно, что из-за хитрости ViewState в ASP.NET вам может потребоваться отправить несколько других параметров вместе с вашим запросом на вход. Вот что вы могли бы сделать: пройти аутентификацию в веб-браузере и посмотреть с помощью FireBug точные параметры и заголовки, которые необходимо отправить.