我正在使用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?
答案 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后重定向到目标页面。