0

我正在使用带有 C# 的 ASP.net 3.5,使用 SQL Server,会话状态存储在 SQL Server DB 中。

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

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

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

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

4

2 回答 2

2

如果您使用 cookie 进行会话,则不会。浏览器不会将 cookie 发送到不匹配的域,并且您不能为所有域设置 cookie。即使可以,会话 cookie 也只是服务器端会话的一个密钥,如果没有访问会话存储,该密钥就没有任何意义。第三方不会有这个。

如果 www.mystore.com 和 www.mystore.shopplatform.com 碰巧都由您拥有的机器支持,并且两台机器都可以访问同一个会话存储,那么您可以使用无 Cookie 的 ASP.NET 会话配置来让它起作用。

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

于 2012-07-13T16:52:11.493 回答
1

由于两个域不同,因此总是会创建新会话。

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

在用户表中创建一个可以存储随机散列的列。uniqueidentifier应该做的数据类型 。

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

这是一个虚拟代码,它将用户重定向到一个公共端点以及一个虚拟查询字符串参数。代码托管在 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 以防止重放攻击。

编辑:请注意。不要将用户发送到受 ASP.Net 保护的页面(其中 Deny="?" 或类似的内容)。将用户重定向到可以处理 tokenid 的公共端点,并在设置 cookie 后重定向到预期页面。

于 2012-07-13T18:19:10.370 回答