Какие есть варианты для обмена данными между поддоменами? - PullRequest
2 голосов
/ 29 октября 2008

У меня есть www.example.com, а также store.example.com. (Да, они являются поддоменами одного и того же родительского домена)

store.example.com на ASP.NET 1.1

www.example.com на ASP.NET 3.5

Я хочу знать, какие варианты доступны для обмена данными сеанса между двумя сайтами. Мне нужен какой-то общий логин, а также возможность отслеживать активность пользователей независимо от того, с какого сайта они начали.

  • Очевидно, что я мог бы отправить GUID при переходе с одного сайта на другой.

  • Я также считаю, что могу установить cookie-файл, который может быть разделен между поддоменами. Я никогда не пробовал это, но, скорее всего, я это сделаю. Мне пока не ясно, является ли это истинным файлом cookie сеанса или я просто установил низкую дату окончания срока действия?

Это мои лучшие варианты или есть что-то еще?

Ответы [ 3 ]

6 голосов
/ 13 августа 2009

Если вы хотите поделиться сессиями между различными приложениями, вам нужно сделать несколько вещей.

Сначала вам нужно запустить состояние сеанса в режиме SQL. В этот момент я обнаружил, что состояние сеанса SQL использует ключ компьютера и ваш _appDomainAppId, чтобы сгенерировать ключ для вашего приложения для доступа к его собственным данным сеанса. Таким образом, мы должны сохранить их одинаковыми для всех ваших приложений.

В веб-конфигах ваших приложений вам нужно использовать один и тот же ключ компьютера. Это может быть любое место внутри тега system.web E.G:

    <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" />

Последнее, что нужно сделать, это разрешить файлу сеанса проходить между доменами ... вот так

  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
  }

И это должно сработать.

3 голосов
/ 29 октября 2008

Важно правильно настроить домен cookie.

Если для домена установлено значение .example.com (обратите внимание на начальный период), то его следует включить в запросы к example.com, а также ко всем поддоменам.

Я полагаю, у вас есть способ обмена данными между разными поддоменами.

0 голосов
/ 29 октября 2008

Вот как бы вы сделали это в PHP:

http://php.dtbaker.com.au/post/keeping_cookies_across_multiple_sub_domains.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...