Laden...
Deletemaster
myCSharp.de - Member
26
Themen
155
Beiträge
Letzte Aktivität
vor 16 Jahren
Dabei seit
19.01.2005
Herkunft
Berlin
Website
Erstellt vor 16 Jahren

Hallo Peter,
ich habe vor mehrere Forms zu entwickeln, auf deren Seiten dann Kundendaten eingegeben werden können, bzw. ausgelesen werden können.
Ich möchte verhindern, daß ein "Fremder" Zugang zu den Seiten hat in dem er einfach die url um die Zielseite erweitert. Diese könnte ihm bekannt geworden sein.
Da ich allerdings auch hier mit den Sessions arbeite und aufrufe würde es schwer werden an Daten zu kommen.

    private void agentur_laden()
    {
        string str_username = (string)Session["login"];

        MySqlCommand cmd = new MySqlCommand();
        cmd.Connection = conn;
        cmd.CommandText = "SELECT agentur_name FROM agenturen INNER JOIN users ON(agenturen.agentur_id = users.agentur_id) WHERE benutzername = '" + str_username + "'";

        MySqlDataReader reader = cmd.ExecuteReader();

        ddl_Agentur.Items.Clear();

        while (reader.Read())
        {
            ddl_Agentur.Items.Add(reader["agentur_name"].ToString());
        }
        reader.Close();

    }

Auch hier würde der "Fremde" nichts zu sehen bekommen, da ja nichts in der Session steht.
Ich habe zwar schon einige Vorstellungen wie ich die anderen Seiten gestalte, aber ich denke das hier die Abfrage, "kommt der Aufruf von der Seite XY" irgendwo bestimmt eine Wichtige Rollte spielen kann / wird.
Und ich werde immer noch auf die Seite nixda.aspx geleitet...
Es wird doch aber geprüft bool ob in dem string:

bool loggedIn;
        if (!bool.TryParse("login".ToString(), out loggedIn) || !loggedIn)
        {

überhaupt etwas steht und es wird doch true zurückgegeben...

Gruß Frank

Ergänzung:
Im Debugger wird:
loggedIn false bool
ausgegeben.

Erstellt vor 16 Jahren

Soweit es die Sessions betrifft funktioniert auch alles.
Ich kann auf der Zielseite mit meinen Daten weiterarbeiten.
login

if (str_username == benutzername && str_kennwort == password && gruppe == "1")
                {
                    Session.Add("login", str_username);
                    Response.Redirect("kunde_neu.aspx");
                }

kunde_neu.aspx

    private void Begruessung()
    {
        string str_login = (string)Session["username"];

        MySqlCommand cmd = new MySqlCommand();
        cmd.Connection = conn;
        cmd.CommandText = "SELECT anrede, nachname FROM users WHERE benutzername = '" + str_login + "'";
        MySqlDataReader reader = cmd.ExecuteReader();
        while (reader.Read())
        {
            lbl_useranrede.Text = reader["anrede"].ToString();
            lbl_Sessionuser.Text = reader["nachname"].ToString();
        }
        reader.Close();
    }

Das funktioniert doch auch.
Mein Problem:
Ich möchte, daß beim Aufruf der Seite kunde_neu.aspx geprüft wird, ob der Aufruf von der login-Seite erfolgte:

Response.Redirect("kunde_neu.aspx");

ich kann wahrscheinlich auch nur prüfen, ob der Session-String leer ist.
Und warum werde ich nun im Code:

        string login = (string)Session["login"].ToString();

        bool loggedIn;
        if (!bool.TryParse("login".ToString(), out loggedIn) || !loggedIn)
        {
            Response.Redirect("nixda.aspx");
        } 

trotz erfolgreicher Anmeldung auf die Seite nixda.aspx geleitet?
Diese Frage hatte ich ja nun schon einige Male gestellt aber nicht mal im Ansatz eine Erklärung dafür bekommen.
Es ist echt schade, daß dieser Thread so lang geworden ist.

Erstellt vor 16 Jahren

Hat die Seite im IIS ein virtuelles Verzeichnis?

Erstellt vor 16 Jahren

Hallo Peter,
also es liegen definitiv KEINE Fehlermeldungen bei meinem benutztem Code vor.
auch ein:

if (!bool.TryParse("login".ToString(), out loggedIn) || !loggedIn)

bringt keine Fehlermeldung.
Warum also werde ich trotz erfolgreicher Anmeldung auf die Seite nixda.aspx katapultiert.
Wenn man keine Fehlermeldung mehr erhält, kann man auch nirgends nachschauen.

Hilfreicher wäre es, nachdem ich geschrieben habe, daß ich den Code nicht nachvollziehen kann, ihn mir vielleicht zu erläutern. Das ist auch eine Art von lernen. So kann ich bei einem ähnlichem Problem vielleicht davon ableiten und brauche niemanden zu "nerven".
Aber ich habe mir nun mal ein größeres Projekt vorgenommen und stehe am Anfang und würde gern von Anfang an sauber und richtig programmieren. Das fängt nun mal bei der Sicherheit an.
In meinen vorigen Projekten habe ich alles sehr einfach realisiert, aber erst wenn man etwas "fertig" hat und benutzt sieht man was man besser machen /ändern kann.

Erstellt vor 16 Jahren

Sorry, zu früh gefreut, ich habe lediglich geprüft, ob ich in die Adresszeile: .../kunde_neu.aspx
eingeben kann ohne mich vorher anzumelden.
Dann lande ich auf der Seite: nixda.aspx
so sollte es sein.
Aber wenn ich mich korrekt anmelde und vorher zu meiner Seite kunde_neu.aspx geleitet wurde, werde ich jetzt trotzdem zu nixda.aspx geleitet?

Ist also noch nicht komplett funktionstüchtig... 😭

An was liegt jetzt dieses?
Danke für die Hilfe

Erstellt vor 16 Jahren

Hallo Peter, ich habs gelesen.

  1. (Session.Add("username", txt_username) , keine Controls oder komplexere Objekte in der Session speichern. (Ausnahmen bilden hier natürlich reine Business Objects)
    Also hier -> txt_username.Text!

Wenn ich wüsste, WIE ich WAS ändern muss, würde ich nicht ständig das gleiche fragen.
Kurze Zeit später:
Nach ein bisschen probieren, hab ich hinbekommen, weiß aber nicht, warum ich bei TryParse das Session weglassen musste???

 bool loggedIn;
        if (!bool.TryParse("login", out loggedIn) || !loggedIn)
        {
            Response.Redirect("nixda.aspx");
        } 

aber zumindest ist jetzt der Erfolg eingetreten.
Ich verstehe zwar den Code nicht komplett, aber kommt vielleicht noch...
Es wird also geprüft, ob es überhaupt einen Benutzernamen gibt liefert also true oder fals zurück soweit so gut
aber was die Teile:
", out loggedIn) || !loggedIn)
bewirken weiß ich leider nicht

Danke Gruß Frank

Erstellt vor 16 Jahren

Hallo zusammen,

hab das jetzt mal versucht, bekomme aber beim Compilieren Fehlermeldungen:
login.aspx.cs:

 if (str_username == benutzername && str_kennwort == password && gruppe "1")
                {
                    Session.Add("username", txt_username.Text);
                    Session["login"] = false;
                    Response.Redirect("kunde_neu.aspx");
                }

kunde_neu.aspx.cs:

 protected void Page_Load(object sender, EventArgs e)
 {
        bool loggedIn;
        if (!bool.TryParse(Session["login"], out loggedIn) || !loggedIn)
        {
            Response.Redirect("nixda.aspx");
        } 
}

Fehlermeldung:
if (!bool. = Fehler 1 Die beste Übereinstimmung für die überladene Methode bool.TryParse(string, out bool) hat einige ungültige Argumente.
Fehler2:
TryParse(Session["login"] = Fehler 2 Das Argument 1 kann nicht von object in string konvertiert werden.
Ich weiß nicht, wie ich diese Fehler beheben kann.

Erstellt vor 16 Jahren

Hallo Peter,
nachdem ich nun das Forum durchforstet habe, bin ich zu meiner Lösung gekommen.
und eigentlich ist es ganz wenig Code:

Seite1:

Session.Add("login", txt_username.Text);
Response.Redirect("kunde_neu.aspx");

Seite2:

string str_login = (string)Session["login"];

Hier kann ich nun gleich in welcher Funktion darauf zugreifen 😉

Nur die Prüfung auf der 2. Seite, ob der Zugriff auf die 2.Seite über das login-Formular erfolgte fehlt mir noch
Reicht hier nicht theoretisch aus, ob der Wert des TextFeldes username auf der login-Seite !="" ist?
Dann könntre ich doch auf die nixda.aspx verweisen.
Das ist bestimmt nicht die eleganteste Methode?
Gruß Frank

Erstellt vor 16 Jahren

Hallo @all,
habe den Fehler gefunden.
Der Einsatz des Parameters @ ist hier Falsch.
Richtig ist:

     private void KundenBestandSuchen()
     {
         string str_CheckVorwahl = txt_CheckVorwahl.Text;
         string str_CheckTelefon = txt_CheckTelefon.Text;
         string str_CheckVrn = str_CheckVorwahl + str_CheckTelefon;

         MySqlCommand cmd = new MySqlCommand();
         cmd.Connection = conn;
         cmd.CommandText = "SELECT COUNT(*) AS anzahl FROM kunden WHERE telefon = '" + str_CheckVrn + "'";
         conn.Open();

         int anzahl = Convert.ToInt32(cmd.ExecuteScalar());

         if (anzahl == 0)
         {
             Alert.Show("Sie können den Kunden mit dieser Telefonnummer in das System eingeben");
         }
         else
         {
             Alert.Show("Sorry, Kunde bereits im System vorhanden");
         }

         conn.Close();
     } 
Erstellt vor 16 Jahren

Hi, ich habe eben noch mal in der DB-Tabelle geschaut und ein Update durchgeführt.
Hier ist definitiv die vorwahl: 0123 und die Telefonnummer 456789
zusammengesetzt ergibt das 0123456789
die Telefonnummer ist als varchar also Text gespeichert, so daß evtl. auch keine führende null verlorengeht.
Habe auch versucht in Einzelschritten zu durchlaufen bzw. zu debuggen...
auch im Debugger wird die
string str_CheckVrn = str_CheckVorwahl + str_CheckTelefon;
mit dem Wert 0123456789 gefüllt...
habe versucht mir mal lediglich die Anzahl im Label auszugeben, auch hier bekomme ich 0 zurück???

private void KundenBestandSuchen()
     {
         string str_CheckVorwahl = txt_CheckVorwahl.Text;
         string str_CheckTelefon = txt_CheckTelefon.Text;
         string str_CheckVrn = str_CheckVorwahl + str_CheckTelefon;

         string str_Anzahl = "SELECT COUNT(*) str_Anzahl FROM kunden WHERE telefon = @telefon";

         MySqlCommand cmd_Anzahl = new MySqlCommand(str_Anzahl, conn);
         conn.Open();
         MySqlDataReader reader = cmd_Anzahl.ExecuteReader();

         while (reader.Read())
         {
             lbl_fehler.Text = reader["str_Anzahl"].ToString(); // 0 wird ausgegeben
         }
         reader.Close();
}

Zu Testzwecken ist das die einzige Telefonnummer (Datensatz) in der Tabelle