C# 使用asp.net和状态服务器在两个网站之间共享会话
我有两个完全相同的网站,在IIS 7.5下托管在两台不同的机器上。 ASP.NET状态服务正在我的计算机上运行,两个站点中的web.config都用以下代码更新:C# 使用asp.net和状态服务器在两个网站之间共享会话,c#,asp.net,iis,state,C#,Asp.net,Iis,State,我有两个完全相同的网站,在IIS 7.5下托管在两台不同的机器上。 ASP.NET状态服务正在我的计算机上运行,两个站点中的web.config都用以下代码更新: <sessionState mode="StateServer" stateConnectionString="tcpip=192.168.1.77:42424" cookieless="false" timeout="120"/> 及 问题是我无法完成这个测试,也无法理解我做错了什么 有什么想法可能有用吗?您需要一种方
<sessionState mode="StateServer" stateConnectionString="tcpip=192.168.1.77:42424" cookieless="false" timeout="120"/>
及
问题是我无法完成这个测试,也无法理解我做错了什么
有什么想法可能有用吗?您需要一种方法来说服浏览器发送相同的ASP.NET会话cookie,而不管它访问哪个站点 如果请求中不存在cookie,则将使用该密钥创建一个新会话 我认为你可以让浏览器通过一些狡猾的DNS配置来保留密钥-如果你分配和作为你站点的地址,然后将ASP.NET会话cookie的域设置为“domain.com”,那么你的浏览器将把它发送到两个站点,会话应该共享
您还可以在ASP.NET中使用无Cookie模式,并从生成的URL中获取会话ID。我知道这个问题在5年前就得到了回答,但今天我想我可以在其中添加更多信息 首先,这不是两个IIS应用程序之间共享会话数据的官方方式,也不是最流行的方式。“貌似官方”的方式是 如果您出于任何原因无法使用SQL server,那么我们可以稍微调整IIS应用程序,以便使用进程外会话,即StateServer会话状态模式 要使其发挥作用,有很多事情需要纠正:
在两个asp.net web应用程序之间共享会话 请参考以下网址
我的问题是,我的两个应用程序使用的是Owin库的不同主要版本。一旦我确保两个应用程序之间的所有Owin库共享同一版本,我就可以通过遵循Hoáng Long发布的答案来实现这一点。因此,如果在Firefox中,我将ASP.NET_SessionId cookie更改为在两个URL中完全相同,例如,它可能会起作用。是吗?是的,我想是的。您还可以使用Fiddler覆盖请求上的cookie值。关于无cookie模式的警告:这是非常不安全的。会话ID在URL中,因此人们可以简单地获取它并以您的身份登录,而不需要任何用户/密码。这对我很有用。特别是第4点是其他SO答案中缺少的内容。
<machineKey validationKey="7CB8DF6872FB6B35DECD3A8F55582350FEE1FAB9BE6B930216056C1B5BA69A4C5777B3125A42C4AECB4419D43EC12F168FD1BB887469798093C3CAA2427B2B89" decryptionKey="02FC52E4C71544868EE297826A613C53537DF8FDAF93FA2C64E9A5EF0BA467FB" validation="SHA1" decryption="AES" />
// At web site 1:
Session["key"] = "value"
// At web site 2:
// Read session value from the other web site
string result = Session["key"]
<httpCookies domain=".your.site"/>
<machineKey validationKey="[your_key]"
decryptionKey="[your_decryption_key]" validation="SHA1" />
<system.web>
<httpCookies domain=".your.site"/>
<machineKey validationKey="your_key" decryptionKey="your_decryption_key" validation="SHA1" />
<sessionState mode="StateServer" timeout="60" />
...
public override void Init()
{
base.Init();
try
{
// Get the app name from config file...
string appName = ConfigurationManager.AppSettings["ApplicationName"];
if (!string.IsNullOrEmpty(appName))
{
foreach (string moduleName in this.Modules)
{
IHttpModule module = this.Modules[moduleName];
SessionStateModule ssm = module as SessionStateModule;
if (ssm != null)
{
FieldInfo storeInfo = typeof(SessionStateModule).GetField("_store", BindingFlags.Instance | BindingFlags.NonPublic);
SessionStateStoreProviderBase store = (SessionStateStoreProviderBase)storeInfo.GetValue(ssm);
if (store == null) //In IIS7 Integrated mode, module.Init() is called later
{
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);
}
else
{
Type storeType = store.GetType();
if (storeType.Name.Equals("OutOfProcSessionStateStore"))
{
FieldInfo uribaseInfo = storeType.GetField("s_uribase", BindingFlags.Static | BindingFlags.NonPublic);
uribaseInfo.SetValue(storeType, appName);
}
}
}
}
}
}
catch (Exception ex)
{
log.Error(ex.Message, ex);
}
}