【问题标题】:session not working asp.net会话不工作 asp.net
【发布时间】:2014-04-30 21:47:51
【问题描述】:

我在这次会议上遇到了一个问题: 它不工作

    protected bool ValidateForm()
{
    if (username.Text == "")
    {
        Err.Text = "please enter username" + "<br/>";
        return false;
    }
    if (password.Text == "")
    {
        Err.Text = "please enter password" + "<br/>";
        return false;
    }
    return true;
}
protected void login_Click(object sender, EventArgs e)
{
    if (ValidateForm())
    {
        SqlDataReader rd1 = Connection.Query("select count(id) as count from sarcadmintable where username ='" + username.Text+"'",true);
        if(rd1.Read())
        {
            if (rd1["count"].ToString() == "0") Err.Text = "please check your username" + "<br/>";
            else
            {
                SqlDataReader rd = Connection.Query("select * from sarcadmintable where username ='" + username.Text + "'", true);
                if (rd.Read())
                {
                    if (rd["password"].ToString() != password.Text)
                        Err.Text = "password is not correct" + "<br/>";
                    else
                    {
                        Session["id"] = rd["user_id"].ToString();
                        Session["prev"] = rd["prev"].ToString();
                        if (!String.IsNullOrEmpty(Request.QueryString["Return"].ToString()))
                            Response.Redirect(Encryption.Decypt_URL(Request.QueryString["Return"]));
                        else
                            Response.Redirect("Main/Default.aspx");
                    }
                }
            }
        }    
    }
}

这就是登录它的工作正常的代码 ...在 master.site 的标题中,我输入了以下代码:

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            if (Session["user_id"] == null || Session["user_id"].ToString() == "" || Session["user_id"].ToString() == "0") Response.Redirect("~/Login.aspx?Return=" + Encryption.Encypt_URL(Request.Url + ""));
            SqlDataReader rd = Connection.Query("select firstname + ' ' + lastname as name from sarcuser where id=" + int.Parse(Session["id"].ToString()), true);
            if (rd.Read())
            {
                label1.Text = rd["name"].ToString();
            }
        }
    }

在 web.config 中:

<!--<sessionState cookieless="true" regenerateExpiredSessionId="true" timeout="525600" mode="InProc" stateNetworkTimeout="525600"/>-->  
      <globalization requestEncoding="utf-8" responseEncoding="utf-8" culture="he-IL"/>
    </system.web>

我将会话作为评论,所以我采用默认会话

但它不起作用......每次我使用真实的用户名和密码按登录时......它会将我重定向到登录页面......并将会话作为空字符串

但是登录代码没问题并且可以恢复正确的值...有什么帮助吗?

【问题讨论】:

  • 撇开会话问题不谈,代码中有一些 SQL 注入漏洞;至少考虑参数化 SQL 命令。至于会话问题,您使用什么进行身份验证?使用正确凭据登录后您被重定向到登录页面这一事实表明身份验证过程不正确
  • 我想念你懂吗??

标签: asp.net session


【解决方案1】:

在 Page_Load 中考虑这段代码

if (Session["user_id"] == null || Session["user_id"].ToString() == "" || Session["user_id"].ToString() == "0") Response.Redirect("~/Login.aspx?Return=" + Encryption.Encypt_URL(Request.Url + ""));

当您在登录按钮单击处理程序中使用密钥 id (Session["id"] = ....) 存储时,您正在检查 user_id (Session["user_id"])

编辑:添加上述解决方案


之前提供的断章取义的答案,留在下方,因为我认为这可能对某人有所帮助

您在母版页的 Page_Load 事件处理程序中编写的代码,将该代码放在 PreRender 事件处理程序中,您的标签将正确更新。

    protected override void OnPreRender(EventArgs e)
    {
        if (!IsPostBack)
        {
            if (Session["user_id"] == null || Session["user_id"].ToString() == "" || Session["user_id"].ToString() == "0")
                Response.Redirect("~/Login.aspx?Return=" + Encryption.Encypt_URL(Request.Url + ""));

            SqlDataReader rd = Connection.Query("select firstname + ' ' + lastname as name from sarcuser where id=" + int.Parse(Session["id"].ToString()), true);
            if (rd.Read())
            {
                label1.Text = rd["name"].ToString();
            }
        }
    }

为什么会这样?

这是因为母版页的Page_Load在内容页的button_Click之前被调用(参考:Sequence that events are raised for Pages, UserControls, MasterPages and HttpModules。所以执行如下:

  1. 您的浏览器请求页面 (login.aspx)
  2. 登录类被实例化
  3. 调用登录页面的OnPreInit(指定母版页)
  4. 母版页已实例化
  5. Lo​​gin.Page_Load被执行
  6. Master.Page_Load被执行
  7. 您的浏览器被请求重定向到 login.aspx
  8. 执行终止(为什么?因为Response.Redirect导致当前线程终止。如果要防止这种异常终止并执行完整页面,请将'false'作为第二个参数传递给Response.Redirect(url, false)

因此,正如您在上面看到的,您的 button_click 永远不会执行。

如何让用户登录

有多种选择:

  • 不要为登录页面使用相同的母版页。
  • 在母版页上,检查当前页面是否为login.aspx,忽略登录的检查
  • 创建一个母版页,指定在公共和经过身份验证的访问中相同的 UI 设计和功能(称为 master1.master)。创建另一个母版页 (master2.master),指定对已验证用户的检查和特定于已验证用户的功能。现在登录页面将使用 master1.master 作为母版页,并且经过身份验证的页面将使用 master2.master 作为母版页。 (与第一点有些相同,但 UI 设计现在只放在一个母版页中)

任何其他开发者可以提出的建议

注意: 如上所述,完全不建议在 PreRender 中检查经过身份验证的用户(这只是为了更新标签),因为它可能会导致某些代码被执行,这在一种情况或另一种情况。

【讨论】:

  • 我已经按照你说的做了……我必须掌握第一页仅用于登录,其他用于 web 应用程序……但仍然无法正常工作,我将你所做的代码添加到它的抛出标题中我一个错误
  • 哪个标题?我提供了要在 OnPreRender 中添加的代码......另外,如果您有单独的母版页进行登录,请不要检查该页面中的用户会话。
  • 我的 masterpage2.site 仅用于登录,不检查会话 .. 而 masterpage1.site 用于网站和名为 header 的控件中...我检查会话...但它也是将我重定向到登录页面...我尝试在 login.aspx 中打印 session["user_id"] 它的工作正常并给了我正确的值
  • 你在 masterpage2.site 上也有这个控件(称为标题)吗?
  • 更改“user_id” ====>>>> "if (Session["user_id"] == null || Session["user_id"].ToString() == "" | | Session["user_id"].ToString() == "0")".......... to ===> "id" (因为你在 login_click 中使用 "id")
【解决方案2】:

我在您的代码中没有看到任何实际的 user.authenticate() 。您的页面是否由某处的另一层身份验证管理?例如。我进入一个打开的页面,输入我的凭据,您检查我的凭据,将我重定向到对我进行身份验证的页面,然后我回到登录页面。此外,您可能会考虑将身份验证移至 page_init,除非您想在每次回发时都这样做。我认为您需要在这里发布更多内容。

【讨论】:

  • 查看我的编辑我发布了登录的所有代码,它工作正常并且具有真实价值,但问题出在会话中
猜你喜欢
  • 1970-01-01
  • 2011-11-10
  • 2011-08-16
  • 2012-02-13
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多