Подтвердить что ты не робот

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

Ответ 1

Я подозреваю, что на веб-странице, к которой вы пытаетесь получить доступ, используется проверка подлинности с помощью форм. Это означает, что вам нужно будет предоставить действительный файл cookie для проверки подлинности, если вы хотите иметь доступ к защищенным ресурсам. И чтобы получить действительный файл cookie для проверки подлинности, вам придется сначала пройти аутентификацию, отправив запрос POST на страницу LogOn, которая выдает файл cookie. После получения файла cookie вы сможете отправить его на последующих запросах на защищенные ресурсы. Вы также должны заметить, что из коробки WebClient не поддерживаются файлы cookie. По этой причине вы можете написать собственный веб-клиент, поддерживающий 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 точные параметры и заголовки, которые необходимо отправить.