2015-10-15 94 views
0

我的手上有一點神祕感,我希望你們都能幫我弄明白。登錄頁面神祕的ASP.Net C#

我正在爲Asp.net C#web應用程序創建登錄頁面。登錄頁面只是一個簡單的Web表單頁面,包含兩個用於輸入用戶名和密碼(帶有命名標籤)的文本框,一個登錄按鈕以及一個隱藏的消息標籤,如果需要,它將通過後面的代碼顯示出來。

登錄按鈕的事件處理程序是兩部分。

首先它查詢數據庫並從我的數據庫中的表中抽取userName,password和userAccessLvl字段,其中用戶名和密碼與文本框中的文本輸入相匹配。非常簡單。

到目前爲止,代碼的工作方式與其打算做的一樣。

現在來看第二部分。

當查詢數據庫並找到匹配記錄時,我將該記錄填充到數據集中,並將名爲AccessLevel的字符串變量設置爲等於數據庫表中userAccessLvl字段的值。然後我運行一個switch語句來評估這個值。

如果值=「A」(對於管理員),那麼登錄頁面應該將用戶重定向到管理頁面。

如果值=「S」(對於標準用戶),那麼登錄頁面應該將用戶重定向到客戶帳戶頁面。

此外,這兩個選項都會設置名爲UserName和AccessLevel的會話變量。

現在這裏是神祕的。如果我嘗試使用數據庫中的任何標準用戶帳戶登錄,則一切正常。但是,如果我嘗試以管理員帳戶登錄,則登錄頁面會刷新,並且不會將我重定向到任何地方。

以下是事件處理程序的代碼。

有什麼想法?如果它很重要,我正在運行VS 2015 Community和Access 2010 DB。

謝謝。

public partial class logIn : System.Web.UI.Page 
{ 
private OleDbConnection connection = new OleDbConnection(); 
private dsUserLogIn LogInData; 
private OleDbDataAdapter sqlDA; 
private string AccessLevel; 

protected void Page_Load(object sender, EventArgs e) 
{ 
    connection.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=E:\\Documents\\Visual Studio 2015\\WebSites\\OneStopFurniture\\App_Data\\OneStopFur.accdb"; 

} 

protected void btn_LogIn_Click(object sender, EventArgs e) 
{ 

    sqlDA = new OleDbDataAdapter("SELECT userName, [password], userAccessLvl FROM [userInfo] WHERE userName ='" + txtUserName.Text + "' AND [password] ='" + txtPassword.Text + "'", connection); 
    LogInData = new dsUserLogIn(); 
    sqlDA.Fill(LogInData.userInfo); 

    if(LogInData.userInfo.Count == 1) 
    { 
     lblLogInMessage.Visible = true; 
     lblLogInMessage.Text = "Username and Password are correct."; 
    } 
    else 
    { 
     lblLogInMessage.Visible = true; 
     lblLogInMessage.Text = "Username and Password are not correct."; 
    } 

    AccessLevel = LogInData.userInfo[0].userAccessLvl.ToString(); 

    switch (AccessLevel) 
    { 
     case "A": 

      Session["UserName"] = txtUserName.Text; 
      Session["AccessLevel"] = "A"; 
      Response.Redirect("adminArea.aspx"); 
      break; 

     case "S": 
      Session["UserName"] = txtUserName.Text; 
      Session["AccessLevel"] = "S"; 
      Response.Redirect("customerAcctArea.aspx"); 
      break; 

     default: 
      break; 
    } 
} 

}

編輯------------------------------------- ---------------

好的。 我在代碼中設置了一箇中斷,以在找到管理記錄時檢查AccessLevel的值。 AccessLevel設置爲「A」;就像它應該的那樣。

我還在Session [「AccessLevel」] =「A」之後設置了一箇中斷,並檢查了該值。該值再次設置爲「A」;正如預期的那樣。

最後,我檢查了我的web.config文件並找不到任何限制訪問任何頁面的內容。

這讓我想知道,如果問題可能不在於不同的帳戶頁面的Page_Load功能,而不是登錄頁面。爲客戶帳戶和管理頁面都在Page_Load函數包含相同的代碼塊

protected void Page_Load(object sender, EventArgs e) 
{ 
    if(Session["AccessLevel"] == null) 
    { 
     Response.Redirect("login.aspx"); 
    } 
    else 
    { 
     lblWelcome.Text = "WELCOME BACK " + Session["UserName"]; 
    } 
} 

現在再次,爲標準用戶(「S」)賬戶,一切工作正常。這是不起作用的管理員(「A」)帳戶。

有一點谷歌的研究表明,ASP.net不喜歡在多個頁面上這樣的相同代碼,並且它可能會導致意想不到的功能。

現在,會話對象似乎在網站的頁面之間保持不變,因爲我檢查了其他工作頁面,並且所有嘗試讀取當前會話對象的記錄都與當前帳戶的記錄匹配登錄。

你覺得,既然兩個頁面上的代碼塊是相同的,它是可能的管理頁面上的Page_Load代碼讀取會話對象爲空(即使它不是)和然後重定向我回到登錄? 會爲代碼塊創建一個單獨的類文件是否可行? 或者我是否會花很長時間才能回到同樣的問題?

只是拋出一些想法,試圖把我的頭圍繞在這一個。 感謝您提供的任何幫助。

+1

是adminArea.aspx是否限制在ASP配置中?這可以解釋它。 – Duston

+4

沒有回答你的問題,我想指出你有兩個主要問題。首先你的密碼是以明文存儲的,這永遠不會發生。其次,你很容易受到SQL注入攻擊 - 我可以通過在你的文本框中輸入一個相當簡單的用戶名來繞過你的安全檢查併成爲系統中的管理員。 – DavidG

+3

強制性註釋:不要推出自己的安全性,散列密碼並避免SQL注入。這個網站是非常不安全的。 –

回答

1

除了其他人提到的有關設計上的缺陷之外,你有一個A和S的情況,並且沒有任何默認設置。最有可能發生的情況是,A案件從未被擊中,您將進入默認設置,這就是爲什麼您保持在同一頁面上。調試以檢查您的訪問級別是什麼,當您認爲它應該是A.

//set breakpoint here to make sure you get an A 
AccessLevel = LogInData.userInfo[0].userAccessLvl.ToString(); 

    switch (AccessLevel) 
    { 
     case "A": 

      Session["UserName"] = txtUserName.Text; 
      Session["AccessLevel"] = "A"; 
      Response.Redirect("adminArea.aspx"); 
      break; 

     case "S": 
      Session["UserName"] = txtUserName.Text; 
      Session["AccessLevel"] = "S"; 
      Response.Redirect("customerAcctArea.aspx"); 
      break; 

     default: 
      break; //you are just falling through to here, not redirecting. 
    } 
+0

@stephen ...我會研究它並報告回來。謝謝。 – tworley1977