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)
    { 
       // parameters: name1=value1&name2=value2  
       WebRequest webRequest = WebRequest.Create (url);
       //string ProxyString = 
       //   System.Configuration.ConfigurationManager.AppSettings
       //   [GetConfigKey("proxy")];
       //webRequest.Proxy = new WebProxy (ProxyString, true);
       //Commenting out above required change to App.Config
       webRequest.ContentType = "application/x-www-form-urlencoded";
       webRequest.Method = "POST";
       byte[] bytes = Encoding.ASCII.GetBytes (parameters);
       Stream os = null;
       try
       { // send the Post
          webRequest.ContentLength = bytes.Length;   //Count bytes to send
          os = webRequest.GetRequestStream();
          os.Write (bytes, 0, bytes.Length);         //Send it
       }
       catch (WebException ex)
       {
          MessageBox.Show ( ex.Message, "HttpPost: Request error"
             MessageBoxButtons.OK, MessageBoxIcon.Error );
       }
       finally
       {
          if (os != null)
          {
             os.Close();
          }
       }
     
       try
       { // get the response
          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;
    } // end HttpPost 
  }

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 user profile iconKha: C#-Tags hinzugefügt
Moderiert von user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Mi 13.06.2012 um 19:28


Kha - Mi 13.06.12 14:00

Wie soll der zweite Request auch von der Session des ersten etwas wissen ;) ? Du musst schon das Session Cookie weiterreichen, z.B. so [http://stackoverflow.com/a/1453590/161659].


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 user profile iconChristian 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

user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
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)
    { 
       // parameters: name1=value1&name2=value2  
       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 user profile iconChristian 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 user profile iconChristian 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.