0

ASP.net 3.5 と C# を使用しており、SQL Server DB にセッション状態が格納されている SQL Server を使用しています。

複数のドメイン間でセッション状態が失われるという問題がありますが、同じブラウザー インスタンスと同じコード ベースを使用しています。

たとえば、顧客をwww.MyStore.comに誘導してストアを閲覧し、顧客をwww.MyStore.ShopPlatform.comに誘導して安全な SSL 検証でチェックアウトしたいとします。www.MyStore.ShopPlatform.comにリダイレクトされると、セッションが再作成されます。

ワイルドカード SSL は www.ShopPlatform.com にインストールされています。

では、問題は.net を使用して、同じサーバー上の複数のドメイン ( www.MyStore.com およびwww.MyStore.ShopPlatform.com ) に1 つのセッション状態 Cookie をどのように関連付けますか?

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 に同じものを追加します。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 を設定した後、目的のページにリダイレクトします。

于 2012-07-13T18:19:10.370 に答える