在.net(非子域)中跨多个域共享会话状态

时间:2012-07-13 16:44:58

标签: c# asp.net .net session cookies

我正在使用ASP.net 3.5 w / C#使用SQL Server和SQL Server DB中存储的会话状态。

我遇到了跨多个域丢失会话状态的问题,但是使用相同的浏览器实例和相同的代码库。

例如,我们正在指导客户 www.MyStore.com 浏览我们的商店,我们希望将客户发送至 www.MyStore.ShopPlatform.com 以结帐w /安全SSL验证。重新定向到 www.MyStore.ShopPlatform.com 时会重新创建会话。

通配符SSL安装在www.ShopPlatform.com。

所以,问题是......如何将1个会话状态cookie与多个域相关联( www.MyStore.com www.MyStore.ShopPlatform.com )在同一台服务器上使用.net?

2 个答案:

答案 0 :(得分:2)

如果您使用Cookie进行会话,则不会。浏览器不会向不匹配的域发送cookie,也不能为所有域设置cookie。即使你可以,会话cookie只是服务器端会话的关键,并且该密钥并不意味着没有访问会话存储的任何东西。第三方不会那样。

如果www.mystore.com和www.mystore.shopplatform.com都支持您拥有的计算机,并且两台计算机都可以访问同一个会话存储,那么您可以使用无Cookie的ASP.NET会话配置使其工作。

一般来说,你不能以这种方式使用会话。

答案 1 :(得分:1)

由于两个域都不同,因此将始终创建新会话。

我建议使用共享数据库方法。

在users表中创建一个可以存储随机哈希的列。数据类型uniqueidentifier应该这样做。

重定向用户时,生成新的GUID并将其存储给当前用户,然后将其附加到重定向的URL。在接收域中,设置一个端点页面,该页面将接受URL编码路径和查询字符串作为ReturnUrl参数和guid的tokenId参数。

这是一个虚拟代码,它将用户重定向到公共端点以及虚拟查询字符串参数。代码托管在domain1.local

Using ctx As New DataContexts.SBWebs
    Dim u As DataEntities.User = (From usr In ctx.Users Where usr.User.Equals(Page.User.Identity.Name) Select usr).FirstOrDefault
    If u Is Nothing Then Exit Sub

    Dim id As Guid = Guid.NewGuid

    u.Token = id
    ctx.SubmitChanges()

    Dim newPath As String = "/protected/?tick=" & Now.Ticks
    Response.Redirect(String.Format("http://www.domain2.local/EndPoint.aspx?tokenid={0}&ReturnUrl={1}", id.ToString, HttpUtility.UrlEncode(newPath)))
End Using

EndPoint.aspx包含以下代码..

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Request.QueryString.HasKeys AndAlso Not String.IsNullOrEmpty(Request.QueryString("tokenid")) Then
        Using ctx As New DataContexts.SBWebs
            Dim usr As DataEntities.User = (From u In ctx.Users Where u.Token.Equals(Request.QueryString("tokenid"))).FirstOrDefault
            If usr Is Nothing Then Exit Sub

            usr.Token = Nothing
            ctx.SubmitChanges()

            FormsAuthentication.RedirectFromLoginPage(usr.User, False)
        End Using
    End If
End Sub

安全注意:创建cookie后,从表中删除GUID以防止REPLAY攻击。

编辑: 只是提醒一句。不要将用户发送到ASP.Net受保护的页面(其中Deny =“?”或类似的东西)。将用户重定向到可以处理tokenid的公共端点,并在设置cookie后重定向到目标页面。