开发者

Logging in to an https site using C#

I'm trying to write a small program that logs in to the Verizon website and then checks how many minutes are left for the month. I need help figuring out how to login to the site using C#. I know I need to use webrequest to post the login information, but I'm not sure how to go about doing it. The site with the login form is https://login.verizonwireless.com/amserver/UI/Login, but I'm not sure what information I have to post to the site to login and how to do it. Below is what I found for the source of the website. If someone can help开发者_StackOverflow me figure out how to login from a C# program I would greatly appreciate it. Thank You for any help.

form method="post" autocomplete="off" action="https://login.verizonwireless.com:443/amserver/UI/Login" name="loginForm" id="loginForm" onsubmit="return disableBut();">

input type="hidden" name="realm" value="vzw" />

input type="hidden" name="goto" value="" />

input type="hidden" name="gotoOnFail" value="" />

input type="hidden" name="gx_charset" value="UTF-8" />

input type="hidden" name="rememberUserNameCheckBoxExists" value="Y" />

h2 style="padding-left:0px;">Sign In to My Verizon

div class="clear10"> /div>


First of all, you're missing the two important fields :) If you look at the HTML, there are two additional fields in the form — IDToken1 (which is username), and IDToken2 (which is password).

If you supply these to the POST request you should get back some cookies which you can then use on subsequent requests. These will identify you as a logged-in user.

Of course, I can't fully test this since I don't have a valid login, but here's a beginning:

class VerizonLogin
{
    CookieContainer Cookies = new CookieContainer();

    void Main()
    {
        Login("test","testpass");

        // Now the cookies in "Cookies" are all set.
        // Ensure you set CookieContainer on all subsequent requests
    }

    void Login(string username, string password)
    {
        var wr = (HttpWebRequest)WebRequest.Create("https://login.verizonwireless.com:443/amserver/UI/Login");
        wr.Method = "POST";
        wr.ContentType = "application/x-www-form-urlencoded";
        wr.Referer = "https://login.verizonwireless.com/amserver/UI/Login"; // my tests show this is needed
        wr.CookieContainer = Cookies;

        var parameters = new Dictionary<string,string>{
            {"realm", "vzw"},
            {"goto",""},
            {"gotoOnFail",""},
            {"gx_charset", "UTF-8"},
            {"rememberUserNameCheckBoxExists","Y"},
            {"IDToken1", username},
            {"IDToken2", password}
        };

        using (var requestStream = wr.GetRequestStream())
        using (var writer = new StreamWriter(requestStream,Encoding.UTF8))
            writer.Write(ParamsToFormEncoded(parameters));

        using (var response = (HttpWebResponse)wr.GetResponse())
        {
            // here you need to detect a correct login... this might be one of the cookies.
            // if incorrect throw an exception or something.
        }
    }

    string ParamsToFormEncoded(Dictionary<string,string> parameters)
    {
        return string.Join("&", parameters.Select(kvp => 
            Uri.EscapeDataString(kvp.Key).Replace("%20","+") + "=" + Uri.EscapeDataString(kvp.Value).Replace("%20","+")
        ).ToArray());
    }
}


Here are 2 functions you need to do this. Yes you are correct, you must use the webrequest, but there is a callback that you need to forge for the validation of the cert from the https. You should be able to use these right out og the box.

C#

private bool ValidateCert(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
{
    return true;
}

private string PostToSite(string url)
{
    string result = string.empty;

    byte[] postBuffer = System.Text.Encoding.GetEncoding(1252).GetBytes("realm=vzw&goto=&gotoOnFail=&gx_charset=UTF-8&rememberUserNameCheckBoxExists=Y");

    HttpWebRequest webRequest = (HttpWebRequest)Net.WebRequest.Create(_endpoint);
    webRequest.KeepAlive = false;
    webRequest.AllowAutoRedirect = false;

    ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(ValidateCert);

    webRequest.ContentLength = postBuffer.Length;
    webRequest.Method = "POST";
    webRequest.ContentType = "application/x-www-form-urlencoded";

    using (Stream str = webRequest.GetRequestStream()) {
        str.Write(postBuffer, 0, postBuffer.Length);
    }

    using (System.Net.HttpWebResponse res = (HttpWebResponse)webRequest.GetResponse()) {
        using (StreamReader sr = new StreamReader(res.GetResponseStream())) {
            result = sr.ReadToEnd();
        }
    }

    return result;
}

VB.NET

Private Function ValidateCert(ByVal sender As Object, ByVal certificate As System.Security.Cryptography.X509Certificates.X509Certificate, ByVal chain As System.Security.Cryptography.X509Certificates.X509Chain, ByVal sslPolicyErrors As System.Net.Security.SslPolicyErrors) As Boolean
 Return True
End Function

Private Function PostToSite(url as string) as string
    Dim result as string = string.empty

    Dim postBuffer As Byte() = System.Text.Encoding.GetEncoding(1252).GetBytes("realm=vzw&goto=&gotoOnFail=&gx_charset=UTF-8&rememberUserNameCheckBoxExists=Y")

    Dim webRequest As HttpWebRequest = CType(Net.WebRequest.Create(_endpoint), HttpWebRequest)
    webRequest.KeepAlive = False
    webRequest.AllowAutoRedirect = False

    ServicePointManager.ServerCertificateValidationCallback = New System.Net.Security.RemoteCertificateValidationCallback(AddressOf ValidateCert)

    webRequest.ContentLength = postBuffer.Length
    webRequest.Method = "POST"
    webRequest.ContentType = "application/x-www-form-urlencoded"

    Using str As Stream = webRequest.GetRequestStream()
        str.Write(postBuffer, 0, postBuffer.Length)
    End Using

    Using res As System.Net.HttpWebResponse = CType(webRequest.GetResponse(), HttpWebResponse)
        Using sr As New StreamReader(res.GetResponseStream())
            result = sr.ReadToEnd()
        End Using
    End Using

    return result
End Function
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜