Как я могу войти на сайт с проверкой подлинности с помощью форм ASP.Net с помощью C #?

Я пытаюсь выполнить очистку экрана веб-сайта, использующего аутентификацию с помощью форм ASP.Net. У меня есть следующий код, который создает Get request to get the cookies, а затем я хочу опубликовать информацию для входа с файлами cookie, которые я только что получил, на страницу login.aspx.

Когда я смотрю, что отправлено на страницу login.aspx с помощью Fiddler, я вижу опубликованные данные, но для отправленных файлов cookie я вижу сообщение " but it says "This request did not send any cookie data."

Если я вхожу в приложение с помощью Internet Explorer, я вижу, что файлы cookie и опубликованные данные отправляются на страницу login.aspx, и все работает нормально.

Но если я пропущу цикл, я могу распечатать файлы cookie, которые, как я предполагаю, должны быть отправлены вместе с запросом с использованием этого блока.

   foreach (System.Net.Cookie cook in getCookies.CookieContainer.GetCookies(new Uri("https://app.example.com")))
   {
        Console.WriteLine(cook.Name + ": " + cook.Value);
    }

Что я делаю неправильно, из-за чего файлы cookie не отправляются вместе с моим запросом?

    public void Login()
    {
        HttpWebRequest getCookies = (HttpWebRequest)WebRequest.Create("https://app.example.com");

        CookieContainer cookieJar = new CookieContainer();
        getCookies.Accept = "image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/vnd.ms-xpsdocument, application/x-ms-application, application/x-ms-xbap, application/xaml+xml, */*";
        getCookies.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0E; .NET4.0C)";
        getCookies.Headers.Add("Accept-Encoding", "gzip, deflate");
        getCookies.AllowAutoRedirect = true;

        getCookies.CookieContainer = cookieJar;
        using (HttpWebResponse cookieResponse = getCookies.GetResponse() as HttpWebResponse)
        {
            StreamReader responseReader = new StreamReader(cookieResponse.GetResponseStream());
            string responseData = responseReader.ReadToEnd();

            string ViewState = this.GetViewStateFromHtml(responseData);

            getCookies = (HttpWebRequest)WebRequest.Create("https://app.example.com/Membership/Login.aspx?ReturnUrl=%2fHome%2fHomeSummary.aspx");
            getCookies.Method = "Post";
            getCookies.ContentType = "application/x-www-form-urlencoded";
            getCookies.Accept = "text/html, application/xhtml+xml. */*";
            getCookies.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0E; .NET4.0C)";
            getCookies.Headers.Add("Accept-Encoding", "gzip, deflate");
            getCookies.AllowAutoRedirect = true;

            ASCIIEncoding encoding = new ASCIIEncoding();
            byte[] byte1 = encoding.GetBytes(this.GetPostData(Username, Password));

            getCookies.ContentLength = byte1.Length;

            StreamWriter requestWriter = new StreamWriter(getCookies.GetRequestStream());
            requestWriter.Write(this.GetPostData(Username, Password));
            requestWriter.Close();
            getCookies.CookieContainer = cookieJar;

            foreach (System.Net.Cookie cook in getCookies.CookieContainer.GetCookies(new Uri("https://app.example.com")))
            {
                Console.WriteLine(cook.Name + ": " + cook.Value);
            }

            using (HttpWebResponse postResponse = (HttpWebResponse)getCookies.GetResponse())
            {
                StreamReader postLoginResponseReader = new StreamReader(postResponse.GetResponseStream());
                string postLoginResponseData = postLoginResponseReader.ReadToEnd();
                File.WriteAllText(@"C:\postLoginResponse.txt", postLoginResponseData);
            }
            Console.WriteLine(@"Check C:\postLoginResponse.txt");
            Console.ReadLine();
        }

person Jive Boogie    schedule 24.10.2011    source источник


Ответы (2)


Я не вижу, куда вы добавляете файлы cookie аутентификации форм в контейнер HttpWebRequest cookie.

В прошлом я делал это

var request = (HttpWebRequest) WebRequest.Create(remoteFilename);
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(new Cookie(".ASPXAUTH", "71AE9C8F6CFDC86BD7FD3AD7B214C4E1", "/", "build.mercaridirect.com.au"));

второстепенный момент Вы должны изменить имя вашей переменной getCookies на webRequest или подобное, это улучшает читаемость.

person wal    schedule 25.10.2011

Это часть более крупного фрагмента кода, поэтому дайте мне знать, если вам потребуется его больше. По сути, вы можете кодировать непосредственно классы MembershipProvider и FormsAuthentication для имитации входа в систему:

bool validated = Membership.ValidateUser(uname, pwd);
if (validated)
{
    if (Request.QueryString["ReturnUrl"] != null)
    {
        FormsAuthentication.RedirectFromLoginPage(uname, false);
    }
    else
    {
        FormsAuthentication.SetAuthCookie(uname, false);
    }
    return;
}
//Response.Write("Failed to authenticate, invalid credentials.");

Надеюсь это поможет.

person Glenn Ferrie    schedule 24.10.2011
comment
Вот как войти в систему, используя FormsAuthentication, он хочет пройти аутентификацию против одного, использующего WebRequest - person Oskar Kjellin; 25.10.2011
comment
Я не на стороне сервера, а на стороне клиента. - person Jive Boogie; 25.10.2011