2

我有一个网站,出于安全原因,我必须在其中为 asp.netSessionId cookie 和 .ASPXAUTH cookie 设置默认路径,该路径通常显示为“/”,特定于应用程序,经过大量 RND 我能够做到这一点,但我有一个混乱和一个问题现在描述如下:

  1. 困惑是:为了使 cookie 路径应用程序特定,我写了一个方法说“setcookiepath”来这样做,并从全局文件的 session_start 中调用该方法,但这不起作用,因为路径在某些点击后有时会被重置或生成了超过 1 个 cookie,其中一个具有默认路径,另一个具有应用程序特定路径。所以我继续从 global.asax 文件中的其他事件中一个一个地调用我的方法,最后从每个事件中调用,但它仍然只在某些时候有效。然后,我仅在第一次使用我在 application_start 中设置的标志调用应用程序时才在 Session_Start 中放弃会话,并在 session_start 中的会话放弃后重置。这次它工作得非常好。现在,

  2. 问题是:虽然现在我的代码正在为该网站工作,但是有一个从该网站内的子文件夹调用的管理模块。对于这个管理子模块,我的代码不起作用,即我面临的问题是。我第一次点击 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;
                    }
                }
            }
        }
4

0 回答 0