我在这次会议上遇到了问题: 它无法正常工作
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>
我将会话作为评论,因此我采用会话的默认值
但它不起作用...每次我按真实用户名和密码登录...它会将我重定向到登录页面...并将会话作为空字符串
但是登录代码很好并且恢复了正确的价值......任何帮助?
答案 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。所以执行如下:
OnPreInit
的“登录”页面被调用(指定母版页)Page_Load
已执行Page_Load
已执行Response.Redirect
导致当前线程终止。如果你想防止这种异常终止并执行整个页面,请将&#39; false&#39;作为第二个参数传递给{{1 }} 因此,正如您在上面所看到的,您的button_click永远不会被执行。
如何让用户登录
有多种选择:
其他开发人员可以建议
注意:如上所述,根本不建议在PreRender中检查经过身份验证的用户(这只是为了更新标签),因为它可能导致执行某些代码,应该在一个案例或另一个案例。