【问题标题】:What options are there for sharing data across subdomains?跨子域共享数据有哪些选择?
【发布时间】:2008-10-29 06:19:18
【问题描述】:

我有www.example.comstore.example.com。 (是的,它们是同一个父域的子域)

store.example.com 在 ASP.NET 1.1 上

www.example.com 在 ASP.NET 3.5 上

我想知道有哪些选项可用于在两个站点之间共享“会话”数据。我需要某种共享登录以及跟踪用户活动的能力,无论他们从哪个站点开始。

  • 显然,当从一个站点转换到另一个站点时,我可以发送一个 GUID。

  • 我也相信我可以设置一个可以跨子域共享的 cookie。我从来没有尝试过,但这很可能是我会做的。我还不清楚这是一个真正的“会话”cookie,还是我只是设置了一个较短的到期日期?

这些是我最好的选择还是有别的选择?

【问题讨论】:

标签: asp.net session subdomain


【解决方案1】:

如果您想在不同应用之间共享会话,您需要做一些事情。

首先,您需要在 SQL 模式下运行会话状态。 此时,我发现 SQL 会话状态使用机器密钥和您的 _appDomainAppId 为您的应用程序生成一个密钥以访问它自己的会话数据。因此,我们需要在您的所有应用之间保持这些相同。

在您的应用程序的网络配置中,您需要使用相同的机器密钥。这可以是 system.web 标签内的任何位置,例如:

    <machineKey decryptionKey="EDCDA6DF458176504BBCC720A4E29348E252E652591179E2" validationKey="CC482ED6B5D3569819B3C8F07AC3FA855B2FED7F0130F55D8405597C796457A2F5162D35C69B61F257DB5EFE6BC4F6CEBDD23A4118C4519F55185CB5EB3DFE61"/>

添加一个 appSetting "ApplicationName" 并为其命名(这两个应用程序必须相同) 然后,您需要创建一个共享会话模块,该模块将更改 _appDomainAppId。下面这个是我用的。

    namespace YourApp
{
  using System.Configuration;
  using System.Reflection;
  using System.Web;

  /// <summary>class used for sharing the session between app domains</summary>
  public class SharedSessionModule : IHttpModule
  {
    #region IHttpModule Members
    /// <summary>
    /// Initializes a module and prepares it to handle requests.
    /// </summary>
    /// <param name="context">An <see cref="T:System.Web.HttpApplication"/>
    /// that provides access to the methods,
    /// properties, and events common to all application objects within an ASP.NET
    /// application</param>
    /// <created date="5/31/2008" by="Peter Femiani"/>
    public void Init(HttpApplication context)
    {
      // Get the app name from config file...
      string appName = ConfigurationManager.AppSettings["ApplicationName"];
      if (!string.IsNullOrEmpty(appName))
      {
        FieldInfo runtimeInfo = typeof(HttpRuntime).GetField("_theRuntime", BindingFlags.Static | BindingFlags.NonPublic);
        HttpRuntime theRuntime = (HttpRuntime)runtimeInfo.GetValue(null);
        FieldInfo appNameInfo = typeof(HttpRuntime).GetField("_appDomainAppId", BindingFlags.Instance | BindingFlags.NonPublic);
        appNameInfo.SetValue(theRuntime, appName);
      }
    }

    /// <summary>
    /// Disposes of the resources (other than memory) used by the module that
    /// implements <see cref="T:System.Web.IHttpModule"/>.
    /// </summary>
    /// <created date="5/31/2008" by="Peter Femiani"/>
    public void Dispose()
    {
    }
    #endregion
  }
}

在网络配置中,您需要添加此模块:

      <add name="SharedSessionModule" type="YourApp.SharedSessionModule, YourApp, Version=1.0.0.0, Culture=neutral" />

最后要做的是允许会话 cookie 在域之间传递......就像这样

  var session = HttpContext.Current.Session;
  var request = HttpContext.Current.Request;
  var cookie = request.Cookies["ASP.NET_SessionId"];
  if (cookie != null && session != null && session.SessionID != null)
  {
    cookie.Value = session.SessionID;
    cookie.Domain = "yourappdomain.com";

    // the full stop prefix denotes all sub domains
    cookie.Path = "/"; // default session cookie path root
  }

这应该可以解决问题。

【讨论】:

【解决方案2】:

重要的是正确设置cookie域。

如果域设置为 .example.com(注意前导句点),那么它应该包含在对 example.com 以及所有子域的请求中。

我假设您有一种在不同子域之间共享数据的方法。

【讨论】:

  • 我喜欢你把我的问题改写为最后的假设 ;-) 谢谢你的信息
  • 对不起,我认为您的问题是关于将 2 个对不同子域的 HTTP 请求识别为属于同一个人的问题。我假设您知道如何连接到例如来自两个不同地方的数据库(每个子域的代码)- 错了吗?我想我不是很清楚
【解决方案3】:

【讨论】:

  • 这是一个 asp.net 问题。 . .
猜你喜欢
  • 1970-01-01
  • 2011-11-27
  • 2020-01-04
  • 2018-05-04
  • 2011-05-09
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
相关资源
最近更新 更多