Как я могу войти на сайт ASP.Net Forms Authenticated с использованием C #? - PullRequest
3 голосов
/ 25 октября 2011

Я пытаюсь отсканировать экран веб-сайта, который использует Аутентификация ASP.Net Forms . У меня есть следующий код, который делает 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();
        }

Ответы [ 2 ]

0 голосов
/ 25 октября 2011

Я не вижу, куда вы добавляете свой файл 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 или аналогичное, что улучшает читаемость.

0 голосов
/ 25 октября 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.");

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...