login with VB.NET and httpwebrequest cookiecontainer

9.6k views Asked by At

I think there is a problem with cookiecontainer (httpwebrequest)

there are 2 main functions in my class, first getting a new form (a hidden token in form tag), and it should set the cookies (which not set) and then second function (doLogin) should login the form. why cookie is not set...? here is my codes: (you can test my code with "http://wetcatdesign.com/wiki/" as wikiURL)

Public Class wiki_submitter
Dim CookieJar As New CookieContainer
Public wikiURL As String

Private Function cutStr(ByVal Str As String, ByVal startStr As String, _
                        ByVal finishStr As String, Optional ByVal startPos As Integer = 1) As String
    Dim start As Integer = InStr(startPos, Str, startStr) + Len(startStr)
    Dim finish As Integer = InStr(start + 1, Str, finishStr)
    cutStr = Mid(Str, start, finish - start)
End Function

Public Function GetNewForm()
    Try
        Dim req As HttpWebRequest = HttpWebRequest.Create(wikiURL & "index.php?title=Special:UserLogin&returnto=Main_Page")
        Dim res As HttpWebResponse
        req.UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:11.0) Gecko/20100101 Firefox/11.0"
        res = req.GetResponse()
        'Setting cookies
        req.CookieContainer = CookieJar

        'getting HTML result
        Dim sr As StreamReader = New StreamReader(res.GetResponseStream())
        Dim HTML = sr.ReadToEnd
        sr.Close()


        Dim wpLoginToken As String = cutStr(HTML, "<input type=""hidden"" name=""wpLoginToken"" value=""", """") ' finding wpLoginToken parameter
        GetNewForm = wpLoginToken
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Function

Public Function doLogin(ByVal username As String, ByVal pass As String)
    Dim req As HttpWebRequest = HttpWebRequest.Create(wikiURL & "index.php?title=Special:UserLogin&action=submitlogin&type=login")
    Dim res As HttpWebResponse
    Dim HTML As String
    '-------Setting up headers------------
    req.UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:11.0) Gecko/20100101 Firefox/11.0"
    req.Referer = wikiURL & "index.php?title=Special:UserLogin&returnto=Main_Page"
    req.ContentType = "application/x-www-form-urlencoded" 'Form content type
    req.Method = "POST" 'data will be send in POST method
    req.CookieContainer = CookieJar 'Setting cookies
    '-------------------------------------

    Dim sw As StreamWriter = New StreamWriter(req.GetRequestStream)
    Dim poststring = "wpLoginToken=" & GetNewForm() & "&wpLoginattempt=Log in&wpName=" & username & "&wpPassword=" & pass
    Try
        sw.Write(poststring)
    Catch ex As Exception
        MsgBox(ex.Message)
    Finally
        sw.Close()
    End Try

    res = req.GetResponse()
    Dim sr As StreamReader = New StreamReader(res.GetResponseStream())
    HTML = sr.ReadToEnd 'HTML as result
    sr.Close()

    doLogin = HTML 'returns HTML result
End Function
End Class
2

There are 2 answers

0
FurqanFas On

Firstly, you need to set cookies before sending the request and secondly you need to extract cookies from the response when you expect them. Here's one way of doing it

Public Class wiki_submitter
    Dim CookieJar As New CookieContainer
    Public wikiURL As String

    Private Function cutStr(ByVal Str As String, ByVal startStr As String, _
                            ByVal finishStr As String, Optional ByVal startPos As Integer = 1) As String
        Dim start As Integer = InStr(startPos, Str, startStr) + Len(startStr)
        Dim finish As Integer = InStr(start + 1, Str, finishStr)
        cutStr = Mid(Str, start, finish - start)
    End Function

    Public Function GetNewForm()
        Try
            Dim req As HttpWebRequest = HttpWebRequest.Create(wikiURL & "index.php?title=Special:UserLogin&returnto=Main_Page")
            Dim res As HttpWebResponse
            req.UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:11.0) Gecko/20100101 Firefox/11.0"
            res = req.GetResponse()
            'Setting cookies
            'req.CookieContainer = CookieJar
            SaveIncomingCookies(res, wikiURL)

            'getting HTML result
            Dim sr As StreamReader = New StreamReader(res.GetResponseStream())
            Dim HTML = sr.ReadToEnd
            sr.Close()


            Dim wpLoginToken As String = cutStr(HTML, "<input type=""hidden"" name=""wpLoginToken"" value=""", """") ' finding wpLoginToken parameter
            GetNewForm = wpLoginToken
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Function

    Public Function doLogin(ByVal username As String, ByVal pass As String)
        Dim req As HttpWebRequest = HttpWebRequest.Create(wikiURL & "index.php?title=Special:UserLogin&action=submitlogin&type=login")
        Dim res As HttpWebResponse
        Dim HTML As String
        '-------Setting up headers------------
        req.UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:11.0) Gecko/20100101 Firefox/11.0"
        req.Referer = wikiURL & "index.php?title=Special:UserLogin&returnto=Main_Page"
        req.ContentType = "application/x-www-form-urlencoded" 'Form content type
        req.Method = "POST" 'data will be send in POST method
        'req.CookieContainer = CookieJar 'Setting cookies
        '-------------------------------------

        Dim sw As StreamWriter = New StreamWriter(req.GetRequestStream)
        Dim poststring = "wpLoginToken=" & GetNewForm() & "&wpLoginattempt=Log in&wpName=" & username & "&wpPassword=" & pass
        Try
            req.CookieContainer = CookieJar
            sw.Write(poststring)
        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            sw.Close()
        End Try

        res = req.GetResponse()
        SaveIncomingCookies(res, wikiURL)
        Dim sr As StreamReader = New StreamReader(res.GetResponseStream())
        HTML = sr.ReadToEnd 'HTML as result
        sr.Close()

        doLogin = HTML 'returns HTML result
    End Function

    Private Function SaveIncomingCookies(ByRef response As HttpWebResponse, ByRef Uri As String)


        If response.Headers("Set-Cookie") <> Nothing Then
            CookieJar.SetCookies(New Uri("http://wetcatdesign.com"), response.Headers("Set-Cookie"))
        End If

    End Function
End Class
2
Pradeep Kumar On

What happens if you set it before res = req.GetResponse() ?