2012-06-07 35 views
0

我有表user_info創建,並在其中有2個用戶名和密碼。 當我執行下面的代碼時,即使我輸入正確的用戶名和密碼,它也會進入「其他」狀態。登錄身份驗證邏輯不工作在C#.NET

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e) 
{ 
    string v = System.Configuration.ConfigurationManager.ConnectionStrings["harish"].ConnectionString; 
    con = new OracleConnection(v); 
    con.Open(); 

    cmd = new OracleCommand("select * from user_info where username='" + Login1.UserName.Trim() + "' and password='" + Login1.Password + "'", con); 
    dr = cmd.ExecuteReader(); 
    dr.Read(); 
    if (dr.HasRows) 
    { 
     Response.Redirect("Default2.aspx"); 
    } 
    else 
    { 
     Response.Redirect("Default.aspx"); 
    } 


    con.Close(); 
    dr.Close(); 
} 
+4

**不要在密碼文本中存儲密碼** – SLaks

+3

您有一個SQL注入漏洞。 – SLaks

+0

其他人指出的問題很多。但是,您需要插入一個斷點,在ExecuteReader處中斷並查看實際值。您也可以直接對Oracle運行生成的查詢,以確保它是正確的。 –

回答

0

首先,你至少應該散列密碼。此外,最好的做法是不要將您的連接留在班級級別。當你使用它們時,它們應該被創建,打開和關閉。與命令,閱讀器等相同......使用塊,可以通過非常輕鬆地完成此操作。

接下來,確保您在使用Login1.UserName和Login1.Password時訪問的是實際字符串值而不是控件。如果您使用控件,則需要使用Login1.UserName.Text.Trim()和Login1.Password.Text.Trim()。您可以通過將您構建的查詢存儲到本地字符串值並查看實際構建的內容來確保這一點。

不要爲您正在做的事情使用DataReader。而是使用ExecuteScalar方法:

protected void Login1_Authenticate(object sender, AuthenticateEventArgs e) 
{ 
    string v = System.Configuration.ConfigurationManager.ConnectionStrings["harish"].ConnectionString; 
    con = new OracleConnection(v); 
    con.Open(); 

    cmd = new OracleCommand("select * from user_info where username='" + Login1.UserName.Trim() + "' and password='" + Login1.Password + "'", con); 
    int count = Convert.ToInt32(cmd.ExecuteScalar()); 
    if (count > 0) 
    { 
     Response.Redirect("Default2.aspx"); 
    } 
    else 
    { 
     Response.Redirect("Default.aspx"); 
    } 

    con.Close(); 
} 

一旦你有這樣的設置,將斷點上如果(計數> 0)線。檢查存儲在本地變量中的查詢並檢查計數。這應該會給你所有你需要的。

+0

我認爲cmd.ExectuteScalar()會返回一個字符串。 int.parse(cmd.ExecuteScalar());但我基於MSSQL – Paparazzi

+0

你說得對,它不會返回一個字符串,但它會返回一個對象,我需要將其轉換。 – Josh

1

它正在進入其他人,因爲博士沒有行。爲了找出原因,把一個破發點上

dr = cmd.ExecuteReader(); 

然後採取actualy SQL SELECT命令的參數和運行此作爲對一個數據庫中的SQL語句,看它是否返回行。我的懷疑是,無論你認爲餵食Login1.Username和/或Login1.Password傳遞什麼,但很難說,不知道如何填寫Login1。

順便說一句,如果這些是網頁上的文本框,那麼您需要使用Login1.Username.Text和Login1.Password.Text來獲取文本框中的實際字符串。