Entwickler-Ecke
ASP.NET und Web - Login bei Session mit C#
csharpbeginner202 - Mi 13.06.12 12:39
Titel: Login bei Session mit C#
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61:
| void BtLoginClick(object sender, EventArgs e) { string url = "login.php"; string username = "user"; string password = "test"; string parameters = String.Format("pUser={0}&pPwd={1}&pLogin=Anmelden", username, password); string response=HttpPost(url, parameters); if (response!=null) MessageBox.Show(response); else MessageBox.Show("Response Error"); } string HttpPost (string url, string parameters) { WebRequest webRequest = WebRequest.Create (url); webRequest.ContentType = "application/x-www-form-urlencoded"; webRequest.Method = "POST"; byte[] bytes = Encoding.ASCII.GetBytes (parameters); Stream os = null; try { webRequest.ContentLength = bytes.Length; os = webRequest.GetRequestStream(); os.Write (bytes, 0, bytes.Length); } catch (WebException ex) { MessageBox.Show ( ex.Message, "HttpPost: Request error", MessageBoxButtons.OK, MessageBoxIcon.Error ); } finally { if (os != null) { os.Close(); } } try { WebResponse webResponse = webRequest.GetResponse(); if (webResponse == null) { return null; } StreamReader sr = new StreamReader (webResponse.GetResponseStream()); return sr.ReadToEnd ().Trim (); } catch (WebException ex) { MessageBox.Show ( ex.Message, "HttpPost: Response error", MessageBoxButtons.OK, MessageBoxIcon.Error ); } return null; } } |
Teil des PHP-Quellcodes von login.php:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| if (isset($_POST['pLogin'])) // Login-Button geklickt? { $user=$_POST['pUser']; // Formulardaten auslesen $pwd=$_POST['pPwd']; if ($user=="user" && $pwd=="test") // richtige Zugangsdaten? { // Login erfolgreich session_start(); <span style="color: red"> $_SESSION['Login_OK']=true;</span> $_SESSION['Benutzername']=$user; header("Location: privat.php"); // weiterleiten zu "privat.php" } } |
Teil des PHP-Quellcodes von privat.php:
session_start();
// session_destroy();
if (isset($_SESSION['Login_OK']))
{
echo "<p><b>".$_SESSION['Benutzername']." Sie haben sich erfolgreich für den internen Bereich authentifiziert. <font color='green'>Permission allowed!</font><br>Ihre aktuelle Session-ID lautetet '".session_id()."'</b></p>";
}
else header("Location: login.php");
Problembeschreibung
Das Problem liegt darin, dass in login.php überprüft wird, ob es sich um den richtigen Nutzer handelt. Wenn ja, dann wird die Session gestartet und
$_SESSION['Login_OK']=true; gesetzt. Danach wird auf privat.php weitergeleitet (funktioniert).
Das Problem liegt darin, dass
$_SESSION['Login_OK']=true; auf privat.php plötzlich nicht mehr verfügbar ist, und somit mittels
else header("Location: login.php"); zu login.php zurückgeleitet wird.
Übrigens, die Sessions funktionieren, wenn man sich über den Browser einloggt.
DANKE für Deine Hilfe
Moderiert von Kha: C#-Tags hinzugefügtModeriert von Christian S.: Topic aus C# - Die Sprache verschoben am Mi 13.06.2012 um 19:28
csharpbeginner202 - Mi 13.06.12 20:24
Vielen Dank für Deine schnelle Hilfe.
Ich glaube, dass mir Dein Link weiterhelfen wird.
Bin mir aber noch nicht sicher, ob er dafür ausreicht, dass ich die Lösung auch umsetzen kann.
Falls nicht frage ich nochmal nach. Ansonsten werde ich die Frage als beantwortet markieren (kann noch ein wenig dauern).
mfg
C#Beginner
csharpbeginner202 - Mi 13.06.12 20:38
Wie schon gesagt vielen Dank für deine rasche Hilfe.
Leider blicke ich gerade nicht durch wie ich den Code in meinen implementieren soll.
Vielleicht kannst Du ja helfen.
Danke, ich will wenn möglich nicht noch mehr Stunden mit der Fehlersuche verbringen.
Kha - Mi 13.06.12 20:49
Du musst lediglich die CookieContainer-Property setzen. Schau dir den Code bitte noch einmal an, das sind nur 3 relevante Zeilen.
csharpbeginner202 - Mi 13.06.12 22:17
Danke,
aber ich erhalte ständig 'Der Name "cookieContainer" ist im aktuellen Kontext nicht vorhanden. (CS0103) - C:\Dokumente und Einstellungen\------\Eigene Dateien\SharpDevelop Projects\login\login\MainForm.cs:57,32'
verwendete namespaces:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; using System.Net; using System.Text; using System.IO; |
Moderiert von Christian S.: C#-Tags hinzugefügt
Christian S. - Mi 13.06.12 22:20
Hast Du die Variable denn deklariert? In dem Codeschnipsel steht ja nur eine Zuweisung.
csharpbeginner202 - Mi 13.06.12 22:43
Ich wollte sie deklarieren, aber mir ist nicht klar an welcher Stelle und auch nicht wirklich wie.
Christian S. - Mi 13.06.12 22:48
Dann sollest Du Dich vielleicht erst einmal mit den Grundlagen beschäftigen. Das Deklarieren einer Variable gehört zu den absoluten Basics. Ein oft empfohlener Einstieg ist das OpenBook C# von Galileo.
csharpbeginner202 - Mi 13.06.12 23:12
Christian S. hat folgendes geschrieben : |
Dann sollest Du Dich vielleicht erst einmal mit den Grundlagen beschäftigen. Das Deklarieren einer Variable gehört zu den absoluten Basics. Ein oft empfohlener Einstieg ist das OpenBook C# von Galileo. |
Vielen Dank für Deine großzügige Hilfe!!!
Die Änderung auf:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| string HttpPost (string url, string parameters) { WebRequest webRequest = WebRequest.Create (url); HttpWebRequest request = (HttpWebRequest)webRequest; CookieContainer cookieContainer = new CookieContainer(); request.CookieContainer = cookieContainer; ... |
oranger Teil wurde eingefügt und hat das Problem gelöst.
Allerdings ist mir leider noch nicht klar, warum das funktioniert!?
Danke an alle, die wirklich geholfen haben.
Moderiert von Christian S.: C#-Tags hinzugefügt
Christian S. - Mi 13.06.12 23:28
Falls Du meinen Hinweis in den falschen Hals bekommen hast, tut mir das Leid. Aber er war absolut ernst gemeint, denn wenn Du die Grundlagen nicht beherrschst, wirst Du nicht weiter kommen. :nixweiss:
csharpbeginner202 - Mi 13.06.12 23:30
Danke,
die Grundlagen beherrsche ich sehr wohl, allerdings stand ich in diesem Fall leider sozusagen auf der Leitung.
Und wie schon gesagt, ich würde die Lösung, die ich gefunden habe gerne auch verstehen. Aber ich glaube, ich werde da auch noch dahinterkommen.
mfg
C#Beginner
Christian S. - Mi 13.06.12 23:36
In dem Beitrag, in dem der Code gepostet wurde, ist es eigentlich ganz schön erklärt: der Cookie-Container speichert die Cookies, die von einem Request gesetzt werden. Dadurch, dass Du denselben Cookie-Container auch im zweiten Request verwendest, stehen die Cookies diesem zur Verfügung - die Session bleibt erhalten.
csharpbeginner202 - Mi 13.06.12 23:40
Gut,
Ich schau mir das ein anderes mal an.
Ist schon spät.
csharpbeginner202 - Mi 13.06.12 23:59
Das komische ist, dass
request
C#-Quelltext
1: 2: 3:
| HttpWebRequest request = (HttpWebRequest)webRequest; CookieContainer cookieContainer = new CookieContainer(); request.CookieContainer = cookieContainer; |
später im Code niemehr vorkommt, sondern lediglich
webRequest.
Daher verstehe ich die Sache nicht ganz.
Moderiert von Christian S.: C#-Tags hinzugefügt
Christian S. - Do 14.06.12 00:10
request und
webRequest verweisen ja auf dasselbe Objekt, nur dass Du bei
request durch einen Cast den Typ genauer festgelegt hast. Der Typ, den
WebRequest.Create zurückgibt, ist ein allgemeiner
WebRequest, weil erst anhand der übergebenen URL festgelegt wird, welche Art von
WebRequest erzeugt wird (siehe
hier [
http://msdn.microsoft.com/en-us/library/bw00b1dc.aspx] bei den Remarks).
Da Du aber weist, dass Du eine HTTP-Url übergebe hast, kannst Du den
webRequest in einen spezielleren
HttpWebRequest casten - Du weist ja, dass
WebRequest.Create so einen erstellt hat. Machen musst Du das, weil nur ein
HttpWebRequest einen Cookie-Container besitzt, den Du ja zuweisen möchtest.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!