会话不工作asp.net

时间:2014-04-30 21:47:51

标签: asp.net session

我在这次会议上遇到了问题: 它无法正常工作

    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>

我将会话作为评论,因此我采用会话的默认值

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

但是登录代码很好并且恢复了正确的价值......任何帮助?

2 个答案:

答案 0 :(得分:0)

我在代码中看不到任何实际的user.authenticate()。您的页面是否由某个身份验证层管理?例如。我进入一个打开的页面,输入我的凭据,检查我的凭据,将我重定向到一个验证我的页面然后繁荣我回到登录页面。您也可以考虑将身份验证移至page_init,除非您希望在每次回发时执行此操作。我想你需要在这里发帖多一点。

答案 1 :(得分:0)

在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 + ""));

您正在检查user_id(会话[&#34; user_id&#34;]),同时您在登录按钮点击时使用密钥ID(会话[&#34; id&#34;] = ....)进行存储处理

修改:上述解决方案已添加


以前提供了脱离背景的答案,因为我认为对某人了解此内容可能有用

您在母版页的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();
            }
        }
    }

为什么会发生这种情况?

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

  1. 您的浏览器请求页面(login.aspx)
  2. 登录类已实例化
  3. OnPreInit的“登录”页面被调用(指定母版页)
  4. 主页面已实例化
  5. 登录。Page_Load已执行
  6. Master。Page_Load已执行
  7. 请求您的浏览器重定向到login.aspx
  8. 执行终止(为什么?因为Response.Redirect导致当前线程终止。如果你想防止这种异常终止并执行整个页面,请将&#39; false&#39;作为第二个参数传递给{{1 }}
  9. 因此,正如您在上面所看到的,您的button_click永远不会被执行。

    如何让用户登录

    有多种选择:

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

    其他开发人员可以建议

    注意:如上所述,根本不建议在PreRender中检查经过身份验证的用户(这只是为了更新标签),因为它可能导致执行某些代码,应该在一个案例或另一个案例。