【问题标题】:How to share session among Multiple Domains on single asp.net website?如何在单个 asp.net 网站上的多个域之间共享会话?
【发布时间】:2011-08-30 02:48:15
【问题描述】:

我想在域之间共享会话 cookie。

我有多个域名:-

1. mydomain.com
2. mydomain.fr
3. mydomain.de
4. mydomain.da
...and many other language based

现在,我在服务器上部署了单个网站。 我想在单个网站上的不同域之间共享会话。我该如何实现?

我在网络上找到了 <httpCookies domain=".mydomain.com" />,但它适用于子域(如 test.mydomain.comsecure.mydomain.com),但不适用于不同的域。

我也尝试了<httpCookies domain=".mydomain." />,但到了这个会话停止工作。

谁能帮帮我?

【问题讨论】:

    标签: asp.net session-cookies multiple-domains website-deployment


    【解决方案1】:

    您不能直接在不同域之间共享 cookie。但是有一种方法可以在某些情况下使其成为可能。您可以发出 JSONP 请求或在 JS 中加载 iframe。如果您使用 iframe,请使用表单进行 http POST 调用。表单标签将您的另一个域名作为操作,将 iframe 名称作为目标。什么形式会加载一个 ifram 并且您的不同域的 cookie 将进入您的浏览器。

    代码:

    <iframe name="iframe-test" border="1px"></iframe>
    
    <form id="iframe-form" target="iframe-test" action="http://differentdomain.com/setCookie" method="POST">
         <input type="hidden" value="1234" name="token">
       </form>
    
        <script type="text/javascript">
            function submitForm(){          
                var form = document.getElementById("iframe-form");
                form.submit();              
            }
        </script>
    

    【讨论】:

      【解决方案2】:

      正如 Oded 所说,您不能在不同的顶级域之间共享 cookie。因此,您可能需要研究另一种保持会话的方法。

      按照 danyolgiax 的建议交换会话状态提供程序不会解决您的问题,因为会话识别仍在使用 cookie 进行。因此,您需要研究一种方法,例如无 cookie 会话:

      Cookieles sessions

      然后您可以选择将数据存储在服务器上的数据库或 InProc 会话中。一旦你移除了对 cookie 的依赖。

      编辑

      此外,如果您使用非身份验证 cookie 进行某些客户端活动,该 cookie 绝对需要存在 cookie,您将根据这些服务器/会话存储值从每个不同的域写入它们。所以切换域的用户最终会得到你的 每个域的 cookie。

      【讨论】:

      • CookieLess 会话在查询字符串中生成会话 ID,这在我当前的项目中是不可行的。
      【解决方案3】:

      如果您使用的是 SQL Server,我认为您可以将其用作会话状态提供程序。

      在 web.config 中:

      <sessionState 
              mode="SQLServer"
              sqlConnectionString="data source=127.0.0.1;user id=<username>;password=<strongpassword>"
              cookieless="false" 
              timeout="20" 
      />
      

      这里有一些文档:

      http://msdn.microsoft.com/en-us/library/ms178581.aspx

      【讨论】:

      • 是的 SqlServer 可以使用,但问题是我在哪里存储 SessionID?
      • 我认为你可以使用 Session.SessionID 属性。
      • 使用 sessionState 模式="SQLServer",Session 对象将被保存到 SqlServer 中,您将能够在域之间共享它。
      • 但是会话ID是cookie的一部分.. sql server只是服务器上会话的存储,但是您需要根据请求发送的会话ID来检索它。所以这不会有什么帮助。
      【解决方案4】:

      您不能在具有不同 top level domain 名称的域上共享 cookie。

      这仅适用于subdomains

      mydomain.com
      fr.mydomain.com
      de.mydomain.com
      da.mydomain.com
      ...
      

      【讨论】:

      • 是的,它有效。但是有没有办法在多个域之间共享数据?
      • @Waqas - 当然有,使用反向通道(例如,相同的数据库)。
      猜你喜欢
      • 2017-09-13
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 2015-08-02
      • 1970-01-01
      • 2013-02-15
      • 2013-03-12
      相关资源
      最近更新 更多