2012-04-30 2 views
0

Я пытаюсь экранировать веб-сайт, для которого требуется аутентификация входа в систему POST. Я могу проверить подлинность на моем первом запросе, но когда я пытаюсь вернуться и перейти на следующую страницу, я получаю перенаправление обратно на страницу входа (в основном это говорит о том, что я не вошел в систему).Использование HttpWebRequest для доступа к нескольким страницам

Код:

Public Function GetPage(ByVal PageName As String, ByVal UserName As String, ByVal Password As String) As String 
    Dim ReturnString As String = "" 
    Dim Cookies As New CookieContainer 
    Dim AuthURI As Uri = New Uri(AuthURL) 
    Cookies.GetCookieHeader(AuthURI) 
    Cookies.GetCookies(AuthURI) 

    'Set Header/Meta Info 
    System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 
    Dim request As HttpWebRequest = HttpWebRequest.Create(AuthURL) 
    request.Method = "POST" 
    request.CookieContainer = Cookies 
    request.UserAgent = "Mozilla/5.0 (Windows; U;Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1" 

    'Set POST Info 
    Dim postData As String = "userName=" & HttpUtility.UrlEncode(UserName) & "&password=" & HttpUtility.UrlEncode(Password) 
    Dim byteArray As Byte() = Encoding.UTF8.GetBytes(postData) 
    request.ContentType = "application/x-www-form-urlencoded" 
    request.ContentLength = byteArray.Length 

    'Write to the request stream 
    Dim dataStream As Stream = request.GetRequestStream() 
    dataStream.Write(byteArray, 0, byteArray.Length) 
    dataStream.Close() 

    ' Get the response. 
    Dim response As HttpWebResponse = request.GetResponse() 
    dataStream = response.GetResponseStream() 
    Dim reader As New StreamReader(dataStream) 
    Dim responseFromServer As String = reader.ReadToEnd() 
    ReturnString = responseFromServer 

    'Append cookie data 
    For Each c As Cookie In response.Cookies 
     Cookies.Add(c) 
    Next 

    ' Clean up the streams. 
    reader.Close() 
    dataStream.Close() 
    response.Close() 

    'Bail on fail 
    If ReturnString.Contains("Login failed") Then Return Nothing 

    'Generate new request 
    request = HttpWebRequest.Create(URLStub & PageName) 
    request.Method = "POST" 
    request.UserAgent = "Mozilla/5.0 (Windows; U;Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1" 
    request.CookieContainer = Cookies 

    'Set POST Info 
    postData = "userName=" & HttpUtility.UrlEncode(UserName) & "&password=" & HttpUtility.UrlEncode(Password) 
    byteArray = Encoding.UTF8.GetBytes(postData) 
    request.ContentType = "application/x-www-form-urlencoded" 
    request.ContentLength = byteArray.Length 

    'Write to the request stream 
    dataStream = request.GetRequestStream() 
    dataStream.Write(byteArray, 0, byteArray.Length) 
    dataStream.Close() 

    'Get the response. 
    response = request.GetResponse 
    dataStream = response.GetResponseStream 
    reader = New StreamReader(dataStream) 
    responseFromServer = reader.ReadToEnd 
    ReturnString = responseFromServer 

    'Clean up the streams. 
    reader.Close() 
    dataStream.Close() 
    response.Close() 

    Return ReturnString 
End Function 

Этот код имитирует другую страницу, которая написана на PHP. Кодовая страница PHP работает, и я использую те же URL-адреса, что и PHP-версия, поэтому я на 99% уверен, что проблема не лежит на сервере.

Также я просмотрел другие сообщения по этому вопросу, и появляется , что я делаю все правильно, синтаксически, но, может быть, мне не хватает чего-то маленького и глупого?

Любые идеи? Я боролся с этим уже пару дней. Заранее спасибо. :)


EDIT: Я играл с сессионными куками и сравнивал между первоначальным входом и фактическим запросом. Вот что я получил:

FIRST: 
ORA_WX_SESSION: "1FAA2AB1EF40DF4BC291DD3326F1DC3C596F56CF-2#3" 
JSESSIONID: a2c38b128e1e54051a2c95c5a3a1e3a4cb0cb5b7ba74cd260aaec531856d722f.e34SahmMbNaMe34Sa3yPaN8Sc40 
XYZCustomerServiceUserName: (login-name) 
XYZ: d53f8dcd87b861a61d99ac21ec53bb2b 

LAST: 
ORA_WX_SESSION: 1FAA2AB1EF40DF4BC291DD3326F1DC3C596F56CF-2#3 
JSESSIONID: a2c38b128e1e54051a2c95c5a3a1e3a4cb0cb5b7ba74cd260aaec531856d722f.e34SahmMbNaMe34Sa3yPaN8Sc40 

Я заметил две вещи ... во-первых, ORA_WX_SESSION имеет свои котировки отделенные от него (даже если я пытаюсь заставить их обратно между ответом и запрос). Также исключаются значения XYZCustomerServiceUserName и XYZ. Помимо этого, информация о сеансе идентична между двумя попытками подключения.

+0

Я бы предположил, что что-то возвращается в ответ, что вы не собираете. – Paparazzi

ответ

0

То, что заставляет вас выйти из системы, может быть всем, что сервер хочет от вас, и вы не предоставили. Мы сделали несколько автоматических систем, используя классы System.Net, и получается, что лучше всего использовать Watin или Selenium. Мы используем Ватина. Используя такой инструмент, на вас не влияют простые изменения на стороне сервера.

Смежные вопросы