我注意到,当我重新启动我的 ASP.Net 应用程序时,已登录用户的凭据会被记住,并且他们可能会发现他们已自动登录。
只要不携带在登录时设置的用户会话变量,这种行为是不受欢迎的。那么,我怎样才能“忘记”应用程序启动时的所有会话呢?
我看到我不能Session.Abandon()
在Application_Start
活动中使用。
我注意到,当我重新启动我的 ASP.Net 应用程序时,已登录用户的凭据会被记住,并且他们可能会发现他们已自动登录。
只要不携带在登录时设置的用户会话变量,这种行为是不受欢迎的。那么,我怎样才能“忘记”应用程序启动时的所有会话呢?
我看到我不能Session.Abandon()
在Application_Start
活动中使用。
启动新会话时使用此代码,即将其添加到 Global.asax
#region remove all cookies
string[] myCookies = Request.Cookies.AllKeys;
foreach (string cookie in myCookies)
{
Response.Cookies[cookie].Expires = DateTime.Now.AddDays(-1);
}
#endregion
重启后Session是否存在?怎么可能?可能您正在使用会话状态服务器或 Sql 服务器。您不能在 Application_Start 事件中使用 Session.Abandon() ,因为当应用程序启动时,那时不存在会话。在 Application_End 事件中调用 Session.Clear() 或 Session.Abandon() 方法,因此当应用程序重新启动时,它必须清除所有会话。
假设您正在使用表单身份验证,这是预期的行为:即使您的应用程序已重新启动,用户仍然拥有有效的 FormsAuthentication cookie。
如果你真的想注销它们,你只需要调用FormsAuthentication.SignOut
.
但我会质疑这样做的必要性——为什么要强迫用户再次输入他的凭据?如果您丢失了存储在 Session 中的状态,您可能需要重定向到主页或其他内容,但无需让用户再次登录。
您必须像这样清除 cookie:
foreach (string key in Request.Cookies.AllKeys)
{
HttpCookie cookie = new HttpCookie(key);
cookie.Expires = DateTime.UtcNow.AddDays(-7);
Response.Cookies.Add(cookie);
}
EDTI: 这样做您的所有 cookie 都将过期。浏览器将尝试删除您的所有 cookie。这将导致不记住用户的登录状态。
希望这可以帮助。