Router-Login via HttpWebRequest

  • VB.NET

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von CodeResearcher.

    Router-Login via HttpWebRequest

    Hallo zusammen,

    ich versuche seit einigen Tagen mich mittels HttpWebRequest/HttpWebResponse an meinem Speedport-Router (Modell: w504v Typ A) einzuloggen. Dazu habe ich bisher folgende Funktion erstellt, die selbstverständlich noch ausbaufähig ist, und mir nur zur Überprüfung
    des Anmeldevorgangs dienen soll.

    VB.NET-Quellcode

    1. Public Function DoRequest(ByVal url As String, ByVal password As String, ByVal container As CookieContainer) As String
    2. 'Login Request
    3. Dim reqLogin As HttpWebRequest = DirectCast(HttpWebRequest.Create("https://speedport.ip/cgi-bin/login.cgi"), HttpWebRequest)
    4. reqLogin.CookieContainer = container
    5. reqLogin.Method = "POST"
    6. reqLogin.Referer = "https://speedport.ip/hcti_start_passwort.stm"
    7. reqLogin.KeepAlive = True
    8. reqLogin.Host = "speedport.ip"
    9. reqLogin.ContentType = "application/x-www-form-urlencoded"
    10. reqLogin.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
    11. reqLogin.Headers.Add("Accept-Language", "de-de,de;q=0.8,en-us;q=0.5,en;q=0.3")
    12. reqLogin.Headers.Add("Accept-Encoding", "gzip, deflate")
    13. 'Login Data
    14. Dim encoding As New ASCIIEncoding()
    15. Dim data As String = Uri.EscapeDataString("pws") & "=" & Uri.EscapeDataString(password)
    16. Dim bytes As Byte() = encoding.GetBytes(data)
    17. reqLogin.ContentLength = bytes.Length
    18. Dim stream As Stream = reqLogin.GetRequestStream
    19. stream.Write(bytes, 0, bytes.Length)
    20. stream.Close()
    21. 'Login Response
    22. Dim resLogin As HttpWebResponse = DirectCast(reqLogin.GetResponse(), HttpWebResponse)
    23. 'Receive Cookie
    24. Dim CookieHeaderValue As String = reqLogin.Headers.Get("Cookie")
    25. If CookieHeaderValue <> Nothing Then
    26. Dim aCookie As String() = CookieHeaderValue.Split("=")
    27. Dim Cookie As New Cookie
    28. Cookie.Domain = "speedport.ip"
    29. Cookie.Path = "/"
    30. Cookie.Secure = True
    31. Cookie.Name = aCookie(0)
    32. Cookie.Value = aCookie(1)
    33. container.Add(Cookie)
    34. End If
    35. 'Url Request
    36. Dim reqIndex As HttpWebRequest = DirectCast(HttpWebRequest.Create(url), HttpWebRequest)
    37. reqIndex.CookieContainer = container
    38. reqIndex.Method = "GET"
    39. reqIndex.Referer = "https://speedport.ip/wait_login.stm"
    40. reqIndex.KeepAlive = True
    41. reqIndex.Host = "speedport.ip"
    42. reqIndex.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
    43. 'Url Content
    44. Dim resIndex As HttpWebResponse = DirectCast(reqIndex.GetResponse(), HttpWebResponse)
    45. Dim sr As StreamReader = New StreamReader(resIndex.GetResponseStream())
    46. Dim output As String = sr.ReadToEnd
    47. resIndex.Close()
    48. Return output
    49. End Function


    Leider liefert diese Funktion jedoch nicht den gewünschten Erfolg. Anstelle der Index-Seite erhalte ich
    den Inhalt von wait_login.stm mit der Meldung:
    "Doppelter Administrationszugriff!"
    Diese Meldung erschient immer dann, wenn versucht wird auf die Administrationsoberfläche zuzugreifen, obwohl
    bereits eine Sitzung geöffnet ist.
    Demnach müsste also der Login bereits erfolgt sein und bei dem Request wird ein erneuter Loginversuch übermittelt.
    Wenn man die Funktion kurz hintereinander ausführt, wird beim zweiten Aufruf kein Wert für das Cookie zurückgeben.
    Erst nach einer Pause von ca. 10 Minuten wird wieder ein Cookie-Value empfangen.

    Die Header-Informationen habe ich über die Firefox AddOn HTTP Live Header ermittelt.
    Ein erfolgreicher Login mittels curl ist mir bisher auch noch nicht gelungen:

    Quellcode

    1. curl -d "pws=PASSWORD" -c cookies.txt -e https://speedport.ip/hcti_start_passwort.stm -k https://speedport.ip/cgi-bin/login.cgi
    2. curl -c cookies.txt -e https://speedport.ip/wait_login.stm -k https://speedport.ip/index.stm


    Vielleicht hat hier ja jemand einen Idee.
    Mit Hilfe des Web Debuggers "Fiddler" konnte ich den Fehler herausfinden. Es muss zwingend ein User Agent bei der ersten Anfrage angegeben werden.

    VB.NET-Quellcode

    1. reqLogin.UserAgent = "USER AGENT STRING"


    Außerdem kann man die Abfrage des Wertes für reqLogin.Headers.Get("Cookie") und das erneute hinzufügen eines Cookies zum Container getrost weglassen, da das Cookie automatisch an den CookieContainer übergeben wird.