如何在c#mvc中保持跨多个子域的会话

本文关键字:会话 c#mvc | 更新日期: 2023-09-27 18:25:34

当我正在处理的购物车应用程序从正常页面进入提交详细信息页面时,它会跳过域。

长话短说,部署了两个应用程序副本:一个服务器用于"主"站点,另一个服务器具有在https上运行的ev证书,用于获取客户详细信息(包括付款;这是PCI合规性问题)。

我的问题是:

当从http://shop.domain->https://secure.domain(如果用户向后浏览,则返回),如何保留会话?

使用JSONP跨域传递cookie很简单,但我不知道如何在远程端使用它们来"重新连接"会话。

我读过关于推出自己的自定义会话提供商的各种文章,等等,但我还没有找到一个不仅仅是一般建议的东西;当然没有关于如何使用它重新加入会话的示例。

这是用于MVC3 c#web应用程序的。

如何在c#mvc中保持跨多个子域的会话

Session的问题是它们被保存在同一个域中。

如果您在子域中有两个应用程序,您可以始终将其附加到web.config

<httpCookies domain=".domain.com"/>

这样就可以了,但如果域完全不同,最好的方法总是推出自己的会话提供者或使用现有的会话提供者,如SQL。

为此,您可以使用任何缓存系统,在该系统中,您不将变量附加到会话变量中,而是将它们作为键/值对附加到缓存中,您可以始终使用NoSQL替代方案(有很多免费帐户,因此您可以进行原型设计并进行概念验证,以推出最后的部分)。

Memcached服务器总是一个很好的选择,Couchbase是免费的社区版本。

这里的诀窍是这样做:

Cache.AddObject(key + "UserInfo-name", "Bruno Alexandre");

其中key可以是在session_start 上的global.asax中附加的查询字符串值

而不是这个

Session["UserInfo-name"] = "Bruno Alexandre";

创建cookie时,必须编写

Response.AppendCookie("Your cookie name");

要知道代码有点像

if (Request.Cookies["Your cookie name"] != null)
{
    string value = Request.Cookies["Your cookie name"].Value;
}

如果有不同的解决方案,那么找到

machineKey它们需要相同。你在下得到的

web.config文件中的system.web

然后在machineKey 之后写入

 <httpCookies domain=".yourdomainname.com" />

我正在使用函数中的HttpContext创建用户会话。

HttpContext cu;
string username = cu.User.Identity.Name;
username = Guid.NewGuid().ToString();
cu.Session["username"] = username;
HttpCookie hc = new HttpCookie("username", username);
hc.Domain = ".yourdomain.com";
hc.Expires = DateTime.Now.AddDays(1d);
cu.Response.Cookies.Add(hc);

使用此代码,我可以在3个子域中共享会话。