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