我正在尝试在我的ASP.NET网站中使用子域,但是我遇到了一些重置会话的问题。
我已将主机文件编辑为'localhost','one.localhost'和'two.localhost'。我可以访问这些URL中的任何一个并执行我需要执行的操作并登录到我的系统。会话模式在web.config中定义如下:
<sessionState cookieless="false" mode="SQLServer" timeout="300"
sqlConnectionString="Data Source=MyDatabase;user id=User1;password=pass"/>
我正在使用SQLServer,因为该网站将作为webfarm运行。
我发现当我点击导致回发的内容时,所有会话都会丢失并创建一个新的会话ID,当发生这种情况时,我的网站现在是'localhost'而不是登录'one.localhost'例如。
有谁知道可能导致这种情况的原因?
干杯
答案 0 :(得分:3)
您的问题似乎有几个问题:
要跨多个子域共享会话信息,您需要将会话cookie写入正确的域,在本例中为.example.com
- 请在此处查看更多信息:"ASP.NET Session State, Cookies and Sub-domains"。
如果您希望用户同时登录所有域,并且您正在使用表单身份验证,则可以使用forms element的domain
属性(请注意域路径中的前导句点) ):
<forms
name="name"
loginUrl="URL"
defaultUrl="URL"
domain=".example.com">
</forms>
您需要在所有网站上配置此功能。
至于为什么你被重定向到localhost而不是在回发上的one.localhost,你需要看一下已经渲染的源(你是否包括一些基本的href信息,或者你的表格是否明确)回发到localhost而不是one.localhost)?查看浏览器正在执行的操作的一个好工具是Fiddler。
最后,作为将其部署到多个服务器的时候,请不要忘记在所有站点上configure your MachineKey以确保它们具有相同的值,以便它们可以解密会话,登录令牌, viewstate等正确。
答案 1 :(得分:1)
基本上,登录cookie中设置的域特定于one.localhost。
有一些可能的黑客攻击。见例如this question的最后一个答案:
在登录/开始页面中,运行以下命令:
Response.Cookies["ASP.NET_SessionId"].Value = Session.SessionID;
Response.Cookies["ASP.NET_SessionId"].Domain = ".mydomain.com";