我有一个网站,出于安全原因,我必须在其中为 asp.netSessionId cookie 和 .ASPXAUTH cookie 设置默认路径,该路径通常显示为“/”,特定于应用程序,经过大量 RND 我能够做到这一点,但我有一个混乱和一个问题现在描述如下:
困惑是:为了使 cookie 路径应用程序特定,我写了一个方法说“setcookiepath”来这样做,并从全局文件的 session_start 中调用该方法,但这不起作用,因为路径在某些点击后有时会被重置或生成了超过 1 个 cookie,其中一个具有默认路径,另一个具有应用程序特定路径。所以我继续从 global.asax 文件中的其他事件中一个一个地调用我的方法,最后从每个事件中调用,但它仍然只在某些时候有效。然后,我仅在第一次使用我在 application_start 中设置的标志调用应用程序时才在 Session_Start 中放弃会话,并在 session_start 中的会话放弃后重置。这次它工作得非常好。现在,
问题是:虽然现在我的代码正在为该网站工作,但是有一个从该网站内的子文件夹调用的管理模块。对于这个管理子模块,我的代码不起作用,即我面临的问题是。我第一次点击 url 时能够登录到管理模块,并为 ASP.NetSessionId 生成 2 个 cookie,一个具有默认路径,另一个具有应用程序特定路径。只要我的浏览器处于打开状态,当我关闭浏览器并尝试重新登录时,这就会起作用,现在我以前的会话 cookie 已被删除,并且我一直被重定向到登录页面,因为当我从登录重定向时,用户会话在某处之间失效页面到管理模块的主页,主网站模块中不会出现此问题。此外,在从 global.asax 中删除路径重置逻辑之后。
请帮忙。
路径集的代码是:
public void setCookieApp()
{
if (HttpContext.Current != null)
{
/// only apply session cookie persistence to requests requiring session information
if (HttpContext.Current.Handler is IRequiresSessionState || HttpContext.Current.Handler is IReadOnlySessionState)
{
SessionStateSection sessionState = (SessionStateSection)ConfigurationManager.GetSection("system.web/sessionState");
string cookieName = sessionState != null && !string.IsNullOrEmpty(sessionState.CookieName) ? sessionState.CookieName : "ASP.NET_SessionId";
string cookieName1 = sessionState != null && !string.IsNullOrEmpty(sessionState.CookieName) ? sessionState.CookieName : ".ASPXAUTH";
//System.TimeSpan timeout = sessionState != null ? sessionState.Timeout : TimeSpan.FromMinutes(20);
/// Ensure ASP.NET Session Cookies are accessible throughout the subdomains.
if (HttpContext.Current.Request.Cookies[cookieName] != null)
{
//Response.Cookies[cookieName].Value = Session.SessionID;
HttpContext.Current.Response.Cookies[cookieName].Path = HttpContext.Current.Request.ApplicationPath;
//Response.Cookies[cookieName].Expires = DateTime.Now.Add(timeout);
}
if (HttpContext.Current.Request.Cookies[cookieName1] != null)
{
//Response.Cookies[cookieName].Value = Session.SessionID;
HttpContext.Current.Response.Cookies[cookieName1].Path = HttpContext.Current.Request.ApplicationPath;
//Response.Cookies[cookieName].Expires = DateTime.Now.Add(timeout);
}
}
foreach (string k in HttpContext.Current.Request.Cookies.AllKeys)
{
if (k.ToString().Contains("ASP.NET_SessionId"))
{
HttpContext.Current.Response.Cookies["ASP.NET_SessionId"].Path = HttpContext.Current.Request.ApplicationPath;
}
else if (k.ToString().Contains(".ASPXAUTH"))
{
HttpContext.Current.Response.Cookies[".ASPXAUTH"].Path = HttpContext.Current.Request.ApplicationPath;
}
}
}
}