0

我在通过子域共享会话时遇到问题。我有一个应用程序可以通过

我像这样设置我的 web.config 文件:

<httpCookies domain=".myapplication.com"/>
<authentication mode="Forms">
<forms loginUrl="index.aspx" cookieless="UseCookies" timeout="60000" enableCrossAppRedirects="true" domain=".myapplication.com"/>
</authentication>

“enableCrossAppRedirects”可以配置为真或假,没有任何变化。

在 IE 中,当我从一个子域切换到另一个子域时,我总是使用同一个会话。但是对于 Firefox,每次我更改子域时,都会为每个子域创建一个新会话。

我在谷歌上阅读了很多文章,但没有任何效果。我不明白为什么 Firefox 与众不同

这是一个简单的aspx代码页,自己测试

<%@ Import NameSpace="System" %>
<%@ Import NameSpace="System.Linq" %>
<%@ Import NameSpace="System.Data" %>
<%@ Import NameSpace="System.Configuration" %>
<%@ Import NameSpace="System.Collections" %>
<%@ Import NameSpace="System.Collections.Generic" %>
<%@ Import NameSpace="System.Web" %>
<%@ Import NameSpace="System.Web.Security" %>
<%@ Import NameSpace="System.Web.UI" %>
<%@ Import NameSpace="System.Web.UI.WebControls" %>
<%@ Import NameSpace="System.Web.UI.WebControls.WebParts" %>
<%@ Import NameSpace="System.Web.UI.HtmlControls" %>
<%@ Import NameSpace="System.Reflection" %>
<%@ Import NameSpace="System.Web.SessionState" %>
<script language="c#" runat="server">

public void Page_Load(object sender, EventArgs e)
{
Log("<b>Refresh twice to see result after switch to another subdomain</b>");
if (Session["CREATION"] == null)
{
string navigateur = HttpContext.Current.Request.ServerVariables["HTTP_USER_AGENT"].ToString    ();
if (navigateur.ToUpper().Contains("FIREFOX"))
{
navigateur = "Firefox";
}
else if (navigateur.ToUpper().Contains("MSIE"))
{
navigateur = "Internet Explorer";
}

Session["CREATION"] = "Session create at " + DateTime.Now.ToString("hh:mm:ss") + " by "     +      navigateur;  
}
Session["HOST"] = Request.Headers["HOST"];
Session["SESSIONID"] = Session.SessionID;
CheckSession();
}
private void Log(string text)
{
Label1.Text += text + "<br/>";
}
public void CheckSession()
{
object obj = typeof(HttpRuntime).GetProperty("CacheInternal", BindingFlags.NonPublic | BindingFlags.Static).GetValue(null, null);   
object[] obj2 = (object[])obj.GetType().GetField("_caches", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(obj);
for (int i = 0; i < obj2.Length; i++)
{
Hashtable c2 = (Hashtable)obj2[i].GetType().GetField("_entries", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(obj2[i]);
foreach (DictionaryEntry entry in c2)
{

object o1 = entry.Value.GetType().GetProperty("Value", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(entry.Value, null);
if (o1.GetType().ToString() == "System.Web.SessionState.InProcSessionState")
{
Log("<hr/>");
SessionStateItemCollection sess = (SessionStateItemCollection)o1.GetType().GetField("_sessionItems", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(o1);                
if (sess != null)
{
foreach (string key in sess.Keys)
{
Label1.Text += key + " = " + sess[key] + "<br>";
}

}
}
}
}

}
</script>

<html>
<body>
<form id="form1" runat="server">

<asp:Label id="Label1" runat="server"/>
</form>
</body>
</html>

希望有人可以帮助我。

问候

4

1 回答 1

0

在设置中从域中删除第一个点。您的代码将如下所示:

<httpCookies domain="myapplication.com"/>
<authentication mode="Forms">
<forms loginUrl="index.aspx" cookieless="UseCookies" timeout="60000" 
      enableCrossAppRedirects="true" domain="myapplication.com"/>
</authentication>

使用这个点,您不会让子域读取 cookie 并创建一个新的。

于 2012-09-26T21:21:25.787 回答