我有 www.example.com
和 store.example.com
。
(是的,它们是同一父域的子域)
store.example.com
使用 ASP.NET 1.1
www.example.com
使用 ASP.NET 3.5
我想知道有哪些选项可用于在两个站点之间共享“ session ”数据。我需要某种共享登录以及跟踪用户事件的能力,无论他们从哪个网站开始。
显然,当从一个站点转换到另一个站点时,我可以发送 GUID。
我还相信我可以设置一个可以跨子域共享的 cookie。我从未尝试过这个,但这很可能是我会做的。我还不清楚这是否是真正的“ session ”cookie,或者我只是设置了一个较低的到期日期?
这些是我最好的选择还是还有其他选择?
最佳答案
如果您想在不同应用程序之间共享 session ,您需要执行一些操作。
首先,您需要在 SQL 模式下运行 session 状态。 此时,我发现 SQL session 状态使用计算 secret 钥和您的 _appDomainAppId 来为您的应用程序生成一个 key 来访问它自己的 session 数据。因此,我们需要在所有应用之间保持这些相同。
在应用程序的网络配置中,您需要使用相同的机器 key 。这可以是 system.web 标签内的任何位置,例如:
<machineKey decryptionKey="EDCDA6DF458176504BBCC720A4E29348E252E652591179E2" validationKey="CC482ED6B5D3569819B3C8F07AC3FA855B2FED7F0130F55D8405597C796457A2F5162D35C69B61F257DB5EFE6BC4F6CEBDD23A4118C4519F55185CB5EB3DFE61"/>
添加一个应用程序设置“ApplicationName”并为其命名(两个应用程序的名称必须相同) 然后,您需要创建一个共享 session 模块,该模块将更改 _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" />
最后要做的事情是允许 session 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 }
这应该可以解决问题。
关于asp.net - 有哪些选项可用于跨子域共享数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/245947/