Avatar billede Slettet bruger
13. december 2005 - 21:10 Der er 7 kommentarer og
1 løsning

Adgangskontrol via en database

Jeg har lavet et simpelt CMS system som man kun skal have adgang til via en adgangskontrol. Jeg gemmer username og password i databasen og bruger nedenstående script:

<%@ page language="C#" runat="server" debug="true"%>
<%@ Import Namespace="System.Data"%>
<%@ Import Namespace="System.Data.SqlClient"%>
<script runat="server">
void Authorize(Object Sender, EventArgs e){
    int Login_ID = DBAuthenticate(Brugernavn.Text, Adgangskode.Text);
    if (Login_ID > 0){
        Session["Godkendt"] = "Godkendt";
        Response.Redirect("../CMSstart.aspx");       
    }
    else
    {     
        Response.Redirect("default.aspx");
    }
}
int DBAuthenticate(string username,string password){
   
    SqlConnection OurConnection;
    SqlCommand OurCommand;
    SqlDataReader OurDataReader;
    string SQLString;
    int Login_ID;
   
    OurConnection = new SqlConnection("Server=localhost;uid=sa;password=;database=Data/Database");
    OurConnection.Open();
    OurCommand = new SqlCommand("Select * from Login", OurConnection);
    OurDataReader = OurCommand.ExecuteReader();
   
    if (OurDataReader.Read()){
        if (OurDataReader["Password"].ToString() == password){
                Login_ID = Int32.Parse(OurDataReader["LoginID"].ToString());
        }else{
                Login_ID = 0;
        }
    }else{
        Login_ID = 0;
    }       
    OurDataReader.Close();
    OurConnection.Close();   
    return Login_ID;
}
</script>
<html>
<head>
<title>Login</title>
</head>
<body bgcolor="#FFFFFF" text="#000000">
<form name="Hanstholm" id="Hanstholm" runat="server">
<asp:TextBox ID="Brugernavn" Font-Name="verdana" Font-Size="10" runat="server" Width="150" />
<asp:TextBox ID="Adgangskode" runat="server" TextMode="Password" Width="150" />             
<asp:Button Text="Ok" Width="90" OnClick="Authorize" runat="server" />            
<asp:Button Text="Annuller" Width="90" OnClick="Authorize" runat="server" />             
</form>
</body>
</html>

Jeg tror problemet ligger i session'en da scriptet konstant sender mig vidre til default.aspx istedet for at godkende mig og sende mig vidre til CMSstart.aspx
Avatar billede akempff Nybegynder
14. december 2005 - 07:51 #1
Hvor grundigt har du testet DBAuthenticate, for det kode du har postet er det ligemeget med session variablerne. Så med mindre at du faktisk bliver redirected til CMSstart.aspx der så ikke tjekker på session["godkendt"] og det så er CMSstart der vidersender til default.aspx, så vil jeg tro det er DBAuthenticate den er gal med.

Har du kun 1 række i login tabellen? For du selecter det hele men læser kun 1 række. Hvis du har mere end 1 række og det ikke er den bruger du rammer i første hug, så vil brugeren ikke blive authenticated, på trods af valide credentials.
   

Det kunne løses lidt alla det er:

int DBAuthenticate(string username,string password){

    SqlConnection OurConnection;
    SqlCommand OurCommand;
    SqlDataReader OurDataReader;
    string SQLString;
    int Login_ID=0;
   
    OurConnection = new SqlConnection("Server=localhost;uid=sa;password=;database=Data/Database");
    OurConnection.Open();
    OurCommand = new SqlCommand("Select * from Login where username=@pUsername", OurConnection);

    SqlParameter pUsername  = new SqlParameter();
    pUsername.ParameterName = "@pUsername";
    pUsername.Value        = inputCity;
   
    OurCommand.Parameters.Add(pUsername);

    OurDataReader = OurCommand.ExecuteReader();
   
    if(OurDataReader.HasRows){
    //bruger fundet
    OurDataReader.Read();
    if(OurDataReader["Password"].ToString() == password)
        Login_ID=Int32.Parse(OurDataReader["LoginID"].ToString());
    }   
    OurDataReader.Close();
    OurConnection.Close(); 
   


    return Login_ID;
}


Ellers så prøv at gå ind og sæt forskellige retur værdier, -1
Avatar billede akempff Nybegynder
14. december 2005 - 07:54 #2
Hov....utilsigtet submit :)

Jeg fortsætter lidt her:
-1, i den ene else og minus 2 i den anden f.eks.
Avatar billede Slettet bruger
14. december 2005 - 20:22 #3
Den må lige forklare lidt mere specifikt! :-\
Avatar billede akempff Nybegynder
14. december 2005 - 21:31 #4
Ok, jeg tror problemet er med din db metode.

Du checker altid kun 1 række i tabellen, hvilket vil være et problem hvis der er flere brugere.

Det kan også være at din connectionstring ikke virker eller andet eller at brugernavnet slet ikke findes.

Her er en tilrettet metode ( nu med færre slå fejl osv :))
Du kan jo prøve om det hjælper:

int DBAuthenticate(string username,string password)
        {
                /* returnere userid eller følgende fejlkoder:
                * -1 = bruger fundet, forkert password
                * -2 = bruger ikke fundet
                * -3 = fejl
                *
                * */
           
                SqlConnection OurConnection = new SqlConnection("Server=localhost;uid=sa;password=;database=Data/Database");
                SqlCommand OurCommand;
                SqlDataReader OurDataReader;
       
                int Login_ID=0;
            try
            {
                OurConnection = new SqlConnection("Server=localhost;uid=sa;password=;database=Data/Database");
                OurConnection.Open();
                OurCommand = new SqlCommand("Select * from Login where username=@pUsername", OurConnection);

                SqlParameter pUsername  = new SqlParameter();
                pUsername.ParameterName = "@pUsername";
                pUsername.Value        = username;
   
                OurCommand.Parameters.Add(pUsername);

                OurDataReader = OurCommand.ExecuteReader();
   
                if(OurDataReader.HasRows)
                {
                    //bruger fundet
                    OurDataReader.Read();
                    if(OurDataReader["Password"].ToString() == password)
                    {
                        Login_ID=Int32.Parse(OurDataReader["LoginID"].ToString());
                    }
                    else
                    {
                        Login_ID = -1;
                    }
                }
                else
                {
                    Login_ID = -2;
                }
                OurDataReader.Close();
                OurConnection.Close();
            }
            catch
            {
                    Login_ID=-3;
            }
            finally
            {
                if(OurConnection.State == System.Data.ConnectionState.Open)
                    OurConnection.Close(); 
            }
           
   
            return Login_ID;
        }
Avatar billede Slettet bruger
18. december 2005 - 23:37 #5
Uanset hvad jeg gør så sender den mig vidre til default.aspx

void Authorize(Object Sender, EventArgs e){
    int Login_ID = DBAuthenticate(Brugernavn.Text, Adgangskode.Text);
    if (Login_ID > 0){
        Session["Godkendt"] = "Godkendt";
        Response.Redirect("CMSstart.aspx");       
    }
    else
    {     
        Response.Redirect("default.aspx"); <--------- HER SENDER DEN MIG HEN!
    }
}
Avatar billede akempff Nybegynder
19. december 2005 - 07:40 #6
Så må dit Login_ID komme tilbage mindre end 1.

Men hvor fejler din DBAuthenticate henne?
Er det din connection, username/password eller noget tredje?

Hvis du prøver at se hvad du rent faktisk får tilbage (0,-1,-2 eller -3)

Hvis du ikke lige har mulighed for at debugge (det virker lidt sådan), så lav en lille test og så arbejd dig videre derfra.


  int Login_ID = DBAuthenticate(Brugernavn.Text, Adgangskode.Text);
switch(Login_ID){
case 0:{Response.Redirect("www.google.com"); break;}
case -1:{Response.Redirect("www.dr.dk"); break;}
case -2:{Response.Redirect("www.tv2.dk"); break;}
case -3:{Response.Redirect("www.dmi.dk"); break;}
}

eller lav en response.write(Login_ID.To.String()) istedet for.
Avatar billede Slettet bruger
20. december 2005 - 09:50 #7
Dette script virker nu. Problemet lå i min database. Tabellen var sat til 16 tegn pr. default og derfor redirectede den hvis alle 16 tegn ikke var udfyldt. Dette er lavet om til 8 tegn og virker fuldt ud.

<%@ page language="c#" runat="server" ResponseEncoding="unicode" debug="true" %>
<%@ Import Namespace="System.Data"%>
<%@ Import Namespace="System.Data.SqlClient"%>
<script runat="server">
void Authorize(Object Sender, EventArgs e){
    int LoginID = DBAuthenticate(Brugernavn.Text, Adgangskode.Text);
   
   
    if (LoginID > 0){
        Session["Godkendt"] = "Godkendt";
        Response.Redirect("CMSstart.aspx");
       
    }else{     
        Response.Redirect("default.aspx");
    }
}

int DBAuthenticate(string Username,string Password){
   
    SqlConnection OurConnection;
    SqlCommand OurCommand;
    SqlDataReader OurDataReader;
    string SQLString;
    int LoginID;
   
    SQLString = "Select LoginID,Password from Login where Username = '" + Username + "'";   
    OurConnection = new SqlConnection("Server=(local);uid=Grp2;Password=rrkh;database=Database");
    OurConnection.Open();
    OurCommand = new SqlCommand(SQLString ,OurConnection);
    OurDataReader = OurCommand.ExecuteReader();
   
    if (OurDataReader.Read()){   
        if (OurDataReader["Password"].ToString() == Password){       
                LoginID = Int32.Parse(OurDataReader["LoginID"].ToString());
        }else{
                LoginID = 0;
        }   
    }else{
        LoginID = 0;
    }   
   
    OurDataReader.Close();
    OurConnection.Close();   
   
    return LoginID;
}

</script>
Avatar billede Slettet bruger
07. februar 2006 - 17:20 #8
lukket
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester