両方のドメインが異なるため、新しいセッションは常に作成されます。
共有データベース アプローチを使用することをお勧めします。
ランダム ハッシュを格納できるユーザー テーブルに列を作成します。のデータ型に uniqueidentifier
する必要があります。
ユーザーをリダイレクトするときは、新しい GUID を生成して現在のユーザー用に保存し、リダイレクトされる URL に同じものを追加します。ReturnUrl
受信側ドメインで、URL エンコードされたパスとクエリ文字列をパラメーターおよび 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="?" などが指定されている場所) にユーザーを送信しないでください。トークン ID を処理できるパブリック エンドポイントにユーザーをリダイレクトし、Cookie を設定した後、目的のページにリダイレクトします。