2015-10-15 106 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