我在asp.net中遇到了会话问题 . 我在网上搜索了一段时间,但找不到它无效的原因 . Session 在几分钟后消失 . 这是一个不是我自己创建的项目,我不是aspx中的英雄 . 但我正试图解决这个问题 .
Web.config
<system.web>
<authentication mode="Forms">
<forms loginUrl="~/Default.aspx" timeout="120" slidingExpiration="true" />
</authentication>
<customErrors mode="RemoteOnly"/>
<httpRuntime requestValidationMode="2.0"/>
<pages validateRequest="false" />
<sessionState mode="InProc" cookieless="false" timeout="120" />
</system.web>
Checking if Logged in on the pages that you have to be logged in if(!functions.isLoggedIn(Session)){Response.Redirect("Default.aspx"); } Functions
public static bool isLoggedIn(HttpSessionState session)
{
return session["user"] != null;
}
Not logged in ? Showing login form, filling in the form and then send it to server to check
protected void Page_Load(object sender, EventArgs e)
{
if (Request["do"] != null)
{
switch (Request["do"])
{
case "logout":
Session.Abandon();
break;
}
}
if (Request.ServerVariables["REQUEST_METHOD"].ToLower() == "post")
{
//get username en password
string username = Request["username"];
string password = Request["password"];
if (String.IsNullOrWhiteSpace(username) || String.IsNullOrWhiteSpace(password))
{
LoginMessage.Text = "Please fill in all the fields...";
}
else
{
password = FormsAuthentication.HashPasswordForStoringInConfigFile(
password,
"SHA1");
UserService gs = new UserService();
user g = gs.getUserByLogin(username, password);
if (g == null)
{
//wrong login
LoginMessage.Text = "Invalid username/password.";
}
else
{
//good login
Session["user"] = g;
System.Diagnostics.Debug.WriteLine("timeout:" + Session.Timeout);
Response.Redirect("Home.aspx");
}
}
}
}
GetUserByLogin function in userservice
public user getUserByLogin(string username, string password)
{
user g;
var db = new projectName.Db.Models.projectnetContext();
IQueryable<user> query = from gb in db.users
where gb.username.Equals(username)
&& gb.Passwoord.Equals(password.ToLower())
&& gb.Status == 1
select gb;
if (!query.Any())
g = null;
else
g = query.First();
return g;
}
After login in, creating the session
Session["user"] = g;
我的问题是我设置了超时 . 但它似乎不起作用 . 如果我检查服务器上的超时,它将设置为120.但是2分钟后,我被重定向到登录表单 . 我能解决这个问题吗?如果我在localhost上调试,它似乎工作,但不在线 .
登录有效 . 会话已设置(否则我无法进入下一页) . 如果我去另一页(更快,然后-5分钟),那么我仍然登录 . 所以问题是生殖 .
或者,如果不可能,Cookies?通常我在PHP中使用cookie,但是有没有办法在ASP.NET中以安全的方式完成它?
4 回答
嗯,我建议你在asp.net中使用profile而不是session .
您的方案有两个方面 . 您有身份验证和会话 . 这是两件不同的事情 .
您在web.config中管理的会话存储了一个超时为120分钟(2小时)的值
但身份验证在web.config中也有一个配置部分 . https://msdn.microsoft.com/en-us/library/532aee0e%28v=vs.85%29.aspx
那么你想先做什么呢?
请找到这个MVC控制器动作方法示例 .
在此示例中,您有:
更新用户配置文件以设置最后一个连接日期和其他如果你想...
以此样本的自定义方式创建身份验证Cookie
根据用户类型重定向到主页
那么,您是否有类似的方法来验证应用程序中的用户?
EDIT1:
通常,您必须最终确定身份验证过程,如下所示:
只是一个建议...你有任何重新指示(Response.Redierct)差异 . 网站或尝试访问您无权访问的资源? Session 将在这些情况下到期 .