由于两个域不同,因此总是会创建新会话。
我建议使用共享数据库方法。
在用户表中创建一个可以存储随机散列的列。uniqueidentifier
应该做的数据类型 。
重定向用户时,生成一个新的 GUID 并将其存储给当前用户,然后将其附加到被重定向的 url。在接收域,设置一个端点页面,该页面将接受 URL 编码路径和查询字符串作为ReturnUrl
参数和tokenId
guid 的参数。
这是一个虚拟代码,它将用户重定向到一个公共端点以及一个虚拟查询字符串参数。代码托管在 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 后重定向到预期页面。