Olen TÄYSIN noviisi näiden asioiden kanssa, miten windows alustalla saan toteutettua niin, että ohjelma tarkistaa tunnuksen ja salasanan, jos nämä ovat oikein, ohjelma jatkaa eteenpäin.
Nämä siis luetaan tekstitiedostosta, mutta olen hieman ulapalla miten tekstitiedostosta saa nämä tiedot tarkistettua. Mitä koodia käyttäen? Kaikki apu tarpeen.
Itselläni käytössä visual studio 2010.
Tarkennappa hieman. Mitä aluetta projektisi koskee?
(esim. ASP, WPF, Windows Forms application?)
Windows Forms application
Lisäys:
Mihin muotoon käyttäjätunnus ja salasanat kannattaa tekstitiedostoon kirjoittaa, jotta ne voidaan lukea järkevästi vai onko sillä väliä? En siis ymmärrä millä koodilla saan kirjautumisen toimimaan, jotta ohjelma tunnistaisi käyttäjätunnuksen ja salasanan oikeaksi, koska käyttäjiä on monta, helppiä?
Kirjoitanko tekstitiedostoon käyttäjätunnukset ja salasanan esimerkiksi näin:
käyttäjätunnus;salasana
tunnari;salis
tunnukseni;salasanani
abc;123
Vai johonkin toiseen muotoon?
Mitä hyötyä ajattelit salasanasta olevan, jos se on selkokielisenä tiedostossa, jonka kuka tahansa voi lukea?
Tarkistaminen sinänsä on hyvin helppoa: teet vain silmukan, jossa tarkistat, onko millään rivillä oikeita tietoja. Jos tässä on jotain epäselvää, kannattaa varmaan lukea jokin C#-alkeisopas, jossa selitetään sellaisia asioita kuin silmukka, ehtolause ja muuttujat.
Moi muppi
tunnus/salasana parin tarkistus tekstitiedostosta voisi näyttää vaikka tältä:
'Pääformi (väännetty SharpDevelope 4.2:lla) using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms; namespace ChkUser { public partial class MainForm : Form { public MainForm() { InitializeComponent(); } void MainFormLoad(object sender, EventArgs e) { FormLogin frmLogin = new FormLogin(); frmLogin.ShowDialog(); frmLogin.Dispose(); if(!frmLogin.logged) { this.Dispose(); } } } }
'Kirjautumislomake using System; using System.IO; using System.Drawing; using System.Windows.Forms; namespace ChkUser { public partial class FormLogin : Form { private bool _logged = false; public bool logged { get{ return _logged; } set { _logged = value; } } public FormLogin() { InitializeComponent(); } void Button1Click(object sender, EventArgs e) { if(textBox1.Text == String.Empty){ textBox1.Focus(); return; } if(textBox2.Text == String.Empty){ textBox2.Focus();return; } string userdata = textBox1.Text + ";" + textBox2.Text; string path = Application.StartupPath + "\\userdata.txt"; //esim. using (StreamReader sr = new StreamReader(path)) { while (sr.Peek() >= 0) { if(sr.ReadLine() == userdata) { logged=true; } } if(logged) { this.Close(); } else { MessageBox.Show("Väärä tunnus ja/tai salasana"); } } } } }
halutessasi voit impata täältä valmiin esimerkkiprojektin
Mikäli taas päättäisit tallentaa tunnukset ja salasanat esim. MsAccess tietokantaan niin kirjautumislomake voisi näyttää vaikkapa seuraavalta
using System; using System.Data; using System.Data.OleDb; using System.Drawing; using System.Windows.Forms; namespace ChkUser { public partial class FormLogin : Form { private bool _logged = false; public bool logged { get{ return _logged; } set { _logged = value; } } public FormLogin() { InitializeComponent(); } void Button1Click(object sender, EventArgs e) { if(textBox1.Text == String.Empty){ textBox1.Focus(); return; } if(textBox2.Text == String.Empty){ textBox2.Focus();return; } string dbpath = Application.StartupPath + "\\Tietokanta1.mdb"; //esim. OleDbConnection conn = new OleDbConnection(); conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;" + @"Data source=" + dbpath; try { conn.Open(); string sql = "SELECT user, pass FROM Taulukko1 Where user='" + textBox1.Text + "' And pass='" + textBox2.Text + "'"; DataSet ds = new DataSet(); OleDbDataAdapter da = new OleDbDataAdapter(sql, conn); da.Fill(ds, "Taulukko1"); if(ds.Tables[0].Rows.Count > 0) { logged = true; } da.Dispose(); ds.Dispose(); } catch(Exception ex) { MessageBox.Show(ex.Message); } finally { conn.Close(); } conn.Dispose(); if(logged) { this.Close(); } else { MessageBox.Show("Väärä tunnus ja/tai salasana"); } } } }
halutessasi voit impata täältä esimerkkiprojektin Access versiona
Kiitos neau33, miljoonasti täytyy lähteä kokeilemaan noita!!
Metabolix: Aion myöhemmin muuttaa salasanatiivisteiksi (esim MD5, mutta jos sais ton alun edes toimimaan.
Lisäys:
Oi jes, aivan mahtavaa, sain toimimaan ton systeemin, kiitos vaan aivan älyttömästi neau33 kun jaksoit vaivaa nähdä!
Noviisina esitän vielä pienen jatkokysymyksen tähän, kirjautumisen jälkeen pitäisi aueta menu-valikko josta pääsee tekemään erilaisia muutoksia jne. eli toisin sanoen itse ohjelma starttaa vasta kirjautumisen jälkeen.
Tälle kannattaa oma form tehdä ilmeisesti, saanko tämän avattua kirjautumisen jälkeen suoraan tuosta "if(logged){this.Close(); }" eli closen tilalle tulisi formin nimi ja käsky? Oliko tarpeeksi vaikeasti kysytty.. :) vai vaatiiko se jonkun muun tavan lähestyä.
Moi taas muppi!
Ei onnistu, eli älä tee kirjautumislomakkeen systeemiin muutoksia vaan lisää menun avaus pääformin Load_tapahtuman yhteyteen. Itse ohjelman tulisi mieluiten toimia suoraan pääformilla.
void MainFormLoad(object sender, EventArgs e) { FormLogin frmLogin = new FormLogin(); frmLogin.ShowDialog(); frmLogin.Dispose(); 'kirjautumisen jälkeen if(!frmLogin.logged) //jos ei ole kirjauduttu (lomake on suljettu ikkunan ruksista) { this.Dispose(); //niin koko ohjelma suljetaan } //voit lisää tähän väliin koodin jolla avaat valinta menun... //elikä voit tehdä sen joko erillisellä lomakkeella (esim. FormMenu) //FormMenu frmMenu = new FormMenu(); //frmMenu.ShowDialog(); //frmMenu.Dispose(); //tai vaihtoehtoisesti voit lisätä pääformiin esim. menustrip objektin, //jonka valikkojen valinnoilla voidaan muuttaa muuttujien arvoja ja //sitäkautta vaikuttaa ohjelmasi ulkoasuun ja käytönaikaiseen toimintaan... }
Moikka taas, kiitos kun jaksat nähdä näinkin paljon vaivaa auttaaksesi!!
Itse sain toimimaan koodin tällä tavalla:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; namespace WindowsFormsApplication4 { public partial class MainForm : Form { private bool _logged = false; public bool logged { get { return _logged; } set { _logged = value; } } public MainForm() { InitializeComponent(); } private void MainForm_Load(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { if (textBox1.Text == String.Empty) { textBox1.Focus(); return; } if (textBox2.Text == String.Empty) { textBox2.Focus(); return; } string userdata = textBox1.Text + ";" + textBox2.Text; string path = Application.StartupPath + "\\userdata.txt"; using (StreamReader sr = new StreamReader(path)) { while (sr.Peek() >= 0) { if (sr.ReadLine() == userdata) { logged = true; } } if (logged) { this.Close(); } else { MessageBox.Show("Väärä tunnus ja/tai salasana"); } } } } }
Joten saako sen toimimaan tuohon? Vai onko tuo väärin toteutettu?
Lisäys:
Form näyttää jokseenkin tältä (hyvin yksinkertainen saa siis olla):
anna käyttäjätunnus: _______ (<=textBox1)
anna salasana: ______(<=textBox2)
|Kirjaudu| (<= button)
Tämän jälkeen avautusi seuraavanlainen valikko
form nimenä vaikkapa "menu"
|päivitä tuote| |päivitä hinta| |julkaise| |lopeta| (<= nämä kaikki buttoneita, ja näiden taakse tulevat omat koodinsa luonnollisesti)
Moi taas!
Koodihan kyllä toimii ei siinä mitään, mutta jos annat oikein tunnuksen ja salasanan niin koko ohjelmasi sulkeutuu. Eli miksi ihmeessä yrität väkisin muuttaa sitä toimivaa kirjautumissysteemiä pääformille nappulan taakse?
No imppaa nyt vielä täältä VisualStudio 2012 Express'llä toteutettu C# esimerkki jossa menu on pääformilla...
Aihe on jo aika vanha, joten et voi enää vastata siihen.