登录页面之谜净c#

本文关键字:登录 | 更新日期: 2023-09-27 18:17:57

我手上有一个小谜团,我希望你们都能帮我弄清楚。

我正在为Asp.net c# web应用程序创建一个登录页面。登录页面只是一个简单的web表单页面,有两个文本框输入用户名和密码(带有命名标签),一个登录按钮和一个隐藏的消息标签,通过返回代码显示,如果我需要它。

登录按钮的事件处理程序由两部分组成。

首先查询数据库,并从my DB中的表中提取字段userName、password和userAccessLvl,其中userName和password与文本框中的文本输入相匹配。非常简单。

到目前为止,代码按照预期工作。

现在是第二部分。

当查询DB并找到匹配的记录时,我将该记录填充到数据集中,并设置一个名为AccessLevel的字符串变量,使其等于DB表中的userAccessLvl字段的值。然后运行一个switch语句来计算该值。

如果value = "A"(对于admin),那么登录页面应该将用户重定向到admin页面。

如果value = "S"(对于标准用户),那么登录页面应该将用户重定向到客户帐户页面。

另外,这两个选项都将设置名为UserName和AccessLevel的会话变量。

这里是一个谜。如果我尝试使用数据库中的任何标准用户帐户登录,那么一切都很好。但是,如果我尝试以admin帐户登录,那么登录页面只是刷新,它不会将我重定向到任何地方。

事件处理程序的代码如下。

任何想法吗?我正在运行VS 2015社区和访问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;
    }
}

}

编辑 ----------------------------------------------------

Ok。我在代码中设置了一个中断,以便在找到管理记录时检查AccessLevel的值。AccessLevel设置为"A";就像它应该的那样。

我还在Session["AccessLevel"] = " a "后设置了一个断点,并检查了该值。同样,该值被设置为"A";如我所愿。

最后,我检查了我的网页。配置文件,找不到任何限制访问任何页面。

这让我怀疑问题可能不在于不同帐户页面的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代码在管理页面读取会话对象为空(即使它不是),然后重定向我回到登录?是否可以为代码块创建单独的类文件?或者我只是绕了很长一段路又回到了同样的问题上?

只是抛出一些想法,试图让我的头脑围绕这个。感谢您提供的帮助。

登录页面之谜净c#

除了其他人提到的设计缺陷之外,您有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.
    }