Benutzer mit den meisten Antworten
Login über HttpWebRequest

Frage
-
Hallo liebes Forum
Ich versuche nun bereits seit längerer Zeit einen Login bei einer Website. Nutze ich ein WebBrowser Control ist das soweit auch kein Problem, ich muss es allerdings ohne schaffen.
Wenn ich einen Request sende:
Dim User = "nutzername", Pwd = "pass" Dim MainpageRequest As HttpWebRequest = CType(WebRequest.Create("https://www.auto-partner.net/portal/at"), HttpWebRequest) Dim MainpageResponse As HttpWebResponse = GetResponse(MainpageRequest) Dim MainpageresponseString As String = RequestStreamToString(MainpageResponse.GetResponseStream)
bekomme ich folgendes zurück Header + HTML:
X-Frame-Options: DENY Content-Language: en-US Keep-Alive: timeout=15, max=26 Connection: Keep-Alive Transfer-Encoding: chunked Content-Type: text/html;charset=UTF-8 Date: Mon, 25 Jan 2016 14:13:04 GMT Set-Cookie: NSC_WT_xxx.bvup-qbsuofs.ofu=ffffffff09f70d1a45525d5f4f58455e445a4a423660;expires=Mon, 25-Jan-2016 14:43:04 GMT;path=/;httponly
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta charset="utf-8"> <title>Partner.Net Anmeldung</title> <!--[if IE]><link rel="shortcut icon" type="image/x-icon" href="/resources/images/favicon/favicon.ico?version=6.3.1.1"><![endif]--> <link rel="icon" type="image/x-icon" href="/resources/images/favicon/favicon.ico?version=6.3.1.1"> <style type="text/css"> @import url("/resources/style/login.css?version=6.3.1.1"); @import url("/resources/style/pnetHead.css?version=6.3.1.1"); </style> <style type="text/css"> @import url("/resources/style/facebox.css?version=6.3.1.1"); </style> <script type="text/javascript" src="/resources/javascript/jquery.js?version=6.3.1.1"></script> <script type="text/javascript" src="/resources/javascript/facebox.js?version=6.3.1.1"></script> <script type="text/javascript" src="/resources/javascript/message.js?version=6.3.1.1"></script> <script type="text/javascript" src="/resources/javascript/error.js?version=6.3.1.1"></script> <script type="text/javascript"> var errorHandler = new Error(); </script> <!-- --> <script type="text/javascript"> $(document).ready(function() { var errors = false; if(errors) { //TODO: Facebox mit enter schließen und focus in username } else $('#j_username').focus(); }); var alreadySubmitted = false; function submitLogin() { if (inputOK()) $('#form').submit(); else //errorHandler wird auf errors.jsp initialisiert errorHandler.showErrors(); } function checkSubmit() { } function inputOK() { var ok = false; if (!alreadySubmitted) { var cUser = $('#j_username').val(); var cPass = $('#j_password').val(); if (cUser.length == 0) { errorHandler.addMessage('Username is required'); } else { if (cPass.length == 0) { errorHandler.addMessage('Password is requried'); } else { ok = true; alreadySubmitted = true; } } } return ok; } function onKeyDownHandler(event) { if (!event) event = window.event; if (event.keyCode == 13) { window.setTimeout("submitLogin()", 250); //stop event if (event.preventDefault) { event.preventDefault(); event.stopPropagation(); } else event.returnValue = false; } } var resizeTimeout = null; var loginDiv = null; $(document).ready(function() { loginDiv = $('#login'); $(window).resize(function(){ if(resizeTimeout != null) clearTimeout(resizeTimeout); resizeTimeout = setTimeout(function() { doResize(); }, 50); }); doResize(); }); function doResize() { var headerHeight = $('#header').height(); if(loginDiv != null) { var left = ($(window).width() / 2) - (loginDiv.width() / 2); var top = (($(window).height() + headerHeight) / 2) - (loginDiv.height() / 2); if(top < headerHeight + 10) top = headerHeight + 10; loginDiv.css('top', top + "px"); loginDiv.css('left', left + "px"); } } </script> </head> <body> <form id="form" action="/auth/j_spring_security_check;jsessionid=2835DA6F46AD6967927E1BAE68477CB9" method="post"> <script type="text/javascript" src="/resources/javascript/jquery.js?version=6.3.1.1"></script> <script type="text/javascript" src="/resources/javascript/pnetHead.js?version=6.3.1.1"></script> <script type="text/javascript"> $(document).ready(function() { new PnetHead({ headContainer: 'header', title: '/resources/images/header_logo.png?version=6.3.1.1', titleIsImage: true, renderFunction: generateEmptyHead }).generateHead(); }); </script> <div id="header"></div> <div id="login" class="login"> <div style="; height: 210px;"> <img class="titleImage" src="/resources/images/login.jpg?version=6.3.1.1" alt=" "/> <h1 class="title"> Welcome to Partner.Net! </h1> </div> <div id="loginForm" class="loginForm"> <table> <colgroup> <col style="width:70px"/> <col style="width:320px"/> </colgroup> <tr> <td>Username</td> <td><input type="text" id="j_username" name="j_username" value="" onkeydown="javascript:onKeyDownHandler(event)" /></td> </tr> <tr> <td style="padding-top: 10px;">Password</td> <td style="padding-top: 10px;"><input type="password" id="j_password" name="j_password" onkeydown="javascript:onKeyDownHandler(event)" /></td> </tr> <tr> <td colspan="2" style="padding-top: 20px;"> <a class="linkImage" href="/auth/login/resetPassword;jsessionid=2835DA6F46AD6967927E1BAE68477CB9">Password lost?</a> <div class="right"> <a class="hot-button" href="javascript:submitLogin();">Login</a> </div> </td> </tr> </table> </div> <div class="footer"> If you have problems with the login, please contact your IT department. </div> </div> </form> </body> </html>
Dann hol ich mir die Session und versuche einen Post für den Login wie folgt aber leider ohne Erfolg, ich bekomme eine HTML Seite mit "Session Timed Out" zurück:
Dim sessionstring As String = Regex.Match(MainpageresponseString, "<form id=""form"" action=[\""'](.+?)[\""']", RegexOptions.IgnoreCase).Groups(0).Value Dim LoginRequest As HttpWebRequest = CType(WebRequest.Create("https://www.auto-partner.net/portal/at;jsessionid=;" & sessionstring), HttpWebRequest) Dim LoginResponse As HttpWebResponse = GetResponse(LoginRequest, " j_username=" & User & "&j_password=" & Pwd) Dim LoginResponseString As String = RequestStreamToString(LoginResponse.GetResponseStream)
Hier noch die Hilfsfunktionen:
Private Function GetResponse(_request As HttpWebRequest, Optional post As String = "") As HttpWebResponse _request.CookieContainer = Cookie _request.Method = "POST" _request.ContentType = "application/x-www-form-urlencoded" Dim byteArray() As Byte = Encoding.UTF8.GetBytes(Post) _request.ContentLength = byteArray.Length Dim DataStream1 As Stream = _request.GetRequestStream() DataStream1.Write(byteArray, 0, byteArray.Length) Dim Response1 As HttpWebResponse = _request.GetResponse() DataStream1.Close() DataStream1.Dispose() Return Response1 End Function Private Function RequestStreamToString(_stream As Stream) As String Dim reader1 As New StreamReader(_stream) Dim ServerResponse1 As String = reader1.ReadToEnd() reader1.Close() reader1.Dispose() Return ServerResponse1 End Function Private Function GetHeaders(_response As HttpWebResponse) As String Dim ret As String = "" For i As Integer = 0 To _response.Headers.Keys.Count - 1 ret += _response.Headers.GetKey(i) & ": " & String.Join(", ", _response.Headers.GetValues(i)) & vbNewLine Next Return ret End Function
Vieleicht kann mir jemand einen schubs in die richtige Richtung geben...
Besten Dank im Voraus
lg Sascha
Antworten
-
Hallo Sascha,
nein, das (anstoßen von clientseitigem Skript per HttpWebRequest und Co.) ist nicht möglich. Letztendlich musst Du dir im Browser (bspw. per FireBug, besser aber wohl mit Fiddler) anschauen, welcher Request genau an den Server (bei der Ausführung des JavaScript Codes) gestellt wird und exakt dasselbe musst Du dann nachstellen.
http://www.telerik.com/fiddler
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 29. Januar 2016 10:06
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 4. Februar 2016 07:10
Alle Antworten
-
Hallo Sascha,
am einfachsten kannst Du das mit einem CookieContainer lösen. Siehe dazu bspw.:
http://stackoverflow.com/questions/6275616/keeping-a-session-when-using-httpwebrequest
Manuell geht es auch, dann musst Du eben den Wert des "Set-Cookie" Reponse Headers auslesen und den dann im jeden Request wieder als "Cookie" mitsenden.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hallo Stefan
Das hatte ich bereits versucht. In meiner Methode GetResponse setze ich den CoockieContainer, leider ohne Erfolg.
Jetzt habe ich allerdings gesehen, das der Login anscheinend über ein JavaScript geht. Beim Button Login ist bei href als Link "JavaScript:submitLogin();" hinterlegt.
Kann ich denn dieses Script auch über httpwebrequest anstoßen?
Besten Dank für die Unterstützung
Grüße
Sascha -
Hallo Sascha,
nein, das (anstoßen von clientseitigem Skript per HttpWebRequest und Co.) ist nicht möglich. Letztendlich musst Du dir im Browser (bspw. per FireBug, besser aber wohl mit Fiddler) anschauen, welcher Request genau an den Server (bei der Ausführung des JavaScript Codes) gestellt wird und exakt dasselbe musst Du dann nachstellen.
http://www.telerik.com/fiddler
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 29. Januar 2016 10:06
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 4. Februar 2016 07:10