C# FormsAuthentication.RedirectToLoginPage()不执行任何操作
我有以下问题:重新发布ASP.NET web app会导致按预期重置会话,其中我保留了额外的用户信息,访问尝试将导致NullReferenceException 为了避免这种情况,我的页面会检查此信息是否存在,如果为空,则会将用户重定向到登录页面forms auth,因此我调用:C# FormsAuthentication.RedirectToLoginPage()不执行任何操作,c#,asp.net,.net,session,session-state,C#,Asp.net,.net,Session,Session State,我有以下问题:重新发布ASP.NET web app会导致按预期重置会话,其中我保留了额外的用户信息,访问尝试将导致NullReferenceException 为了避免这种情况,我的页面会检查此信息是否存在,如果为空,则会将用户重定向到登录页面forms auth,因此我调用: void LogOut() { Session.Clear(); Session.Abandon(); User = null; FormsAuthentication.SignOut(
void LogOut()
{
Session.Clear();
Session.Abandon();
User = null;
FormsAuthentication.SignOut();
FormsAuthentication.RedirectToLoginPage()
}
但有时也没用,所以我找到了一个解决办法:
Response.Redirect(FormsAuthentication.LoginUrl);
但它没有添加returnUrl,我希望它是我不想手动模拟这种行为
所以我想弄明白为什么第一种方法不能像预期的那样工作
我有以下问题:重新发布ASP.NET web app会导致按预期重置会话,其中我保留了额外的用户信息,访问尝试将导致NullReferenceException
但有时也没用
我不确定你所说的有时没有帮助是什么意思——你没有说到底发生了什么
但您应该记住,表单身份验证票证的过期和会话超时的过期是完全独立的。当用户的窗体身份验证票证仍然有效时,其会话可能会超时,反之亦然
通常,从会话访问数据时,应始终首先测试数据是否存在,并在必要时刷新数据:
object o = Session["Whatever"];
if (o == null)
{
o = ... refresh it e.g. from the database
Session["Whatever"] = o;
}
...
通常,使用助手类来封装这一点很有用
在您的例子中,您引用了其他用户信息-因此您可能能够使用HttpContext.Current.user.Identity.Name作为密钥检索此信息
由于会话已过期(例如,由于服务器上的应用程序池回收),强制用户再次登录是非常不友好的
更新
MSDN文件规定:
与HttpResponse.Redirect方法不同,此方法不会通过调用HttpResponse.end来结束请求。这意味着将运行RedirectToLoginPage方法调用后面的代码
这可能解释了您所看到的情况:调用RedirectToLoginPage后,页面生命周期中的代码正在运行,并引发NullReferenceException
您可以在RedirectToLoginPage之后调用Response.End以避免此情况
My Session timeout set=通过web.config形成身份验证超时 我将再次重申,会话到期和FormsAuthentication到期是不相关的,即使超时恰好相同。FormsAuthenticationCookie将在服务器上的应用程序池循环中生存;会议将不会结束 我有以下问题:重新发布ASP.NET web app会导致按预期重置会话,其中我保留了额外的用户信息,访问尝试将导致NullReferenceException 但有时也没用 我不确定你所说的有时没有帮助是什么意思——你没有说到底发生了什么 但您应该记住,表单身份验证票证的过期和会话超时的过期是完全独立的。当用户的窗体身份验证票证仍然有效时,其会话可能会超时,反之亦然 通常,从会话访问数据时,应始终首先测试数据是否存在,并在必要时刷新数据:
object o = Session["Whatever"];
if (o == null)
{
o = ... refresh it e.g. from the database
Session["Whatever"] = o;
}
...
通常,使用助手类来封装这一点很有用
在您的例子中,您引用了其他用户信息-因此您可能能够使用HttpContext.Current.user.Identity.Name作为密钥检索此信息
由于会话已过期(例如,由于服务器上的应用程序池回收),强制用户再次登录是非常不友好的
更新
MSDN文件规定:
与HttpResponse.Redirect方法不同,此方法不会通过调用HttpResponse.end来结束请求。这意味着将运行RedirectToLoginPage方法调用后面的代码
这可能解释了您所看到的情况:调用RedirectToLoginPage后,页面生命周期中的代码正在运行,并引发NullReferenceException
您可以在RedirectToLoginPage之后调用Response.End以避免此情况
My Session timeout set=通过web.config形成身份验证超时
我将再次重申,会话到期和FormsAuthentication到期是不相关的,即使超时恰好相同。FormsAuthenticationCookie将在服务器上的应用程序池循环中生存;会话将不可用。是否尝试呼叫响应。在FormsAuthentication.RedirectToLoginPage之后结束?是否尝试呼叫响应。在FormsAuthentication.RedirectToLoginPage之后结束?感谢您的响应。发生了什么和没有发生什么:RedirectToLoginPage什么都不做-代码提前执行,我得到了NullReferenceException,因为在会话中保留有关当前用户的更多信息一些链接对象,例如ClientCompanyNameMy session timeout set=Forms auth timeout via web.config。用户将被forms auth自动重定向到登录页面,这将按预期工作。但是我的情况
更多的开发/部署过程是否相关:发布新版本后,我希望被重定向到登录页面,并且不获取NullReferenceException。感谢您的回复。发生了什么和没有发生什么:RedirectToLoginPage什么都不做-代码提前执行,我得到了NullReferenceException,因为在会话中保留有关当前用户的更多信息一些链接对象,例如ClientCompanyNameMy session timeout set=Forms auth timeout via web.config。用户将被forms auth自动重定向到登录页面,这将按预期工作。但我的场景与开发/部署过程更为相关:发布新版本后,我希望被重定向到登录页面,并且不获取NullReferenceException。