Cookie は、Web 開発者がユーザーのログイン状態を保持できるようにする素晴らしい発明です。しかし、サイトに複数のドメイン名がある場合、問題が発生します。 Cookie の仕様によれば、Cookie は 1 つのドメイン名に対してのみ使用でき、他のドメイン名に送信することはできません。したがって、ブラウザーで 1 つのドメイン名に対して Cookie が設定されている場合、その Cookie は他のドメイン名に対しては無効になります。ユーザーがいずれかのサイトからログインし、他のドメインからもログインできるようにしたい場合、これは大きな問題となる可能性があります。
第 2 レベルのドメイン名間で
これは、たとえば、www.test1.com の Web アプリケーションで Cookie を作成すると、簡単に理解できます。 bbs.test1.com で使用したい このような第 2 レベルのドメイン名に対応するアプリケーションにアクセスするには、Cookie の作成時にドメイン パラメーターdomain=test1.com を設定する必要があります。 asp.net を例に取ると、コードは次のとおりです。
HttpCookie cookie = new HttpCookie("name", "www.Admin10000.com"); cookie.Domain = "test1.com"; cookie.Path = "/"; Response.Cookies.Add(cookie);
トップレベル ドメイン名を横断する
私がセカンドレベル ドメイン名ではなく、完全に異なるトップレベル ドメイン名に属している場合、たとえば、 www.test1.com が存在する Web アプリケーションは Cookie を作成します。www.test2.com またはその第 2 レベル ドメイン名アプリケーションにアクセスした場合はどうすればよいですか?従来の対策ではアクセスできないことはわかっていますが、何らかの方法でアクセスできるかどうかが重要です。実際のところ、Cookie は意のままにクロスドメインを実現するのではなく、特定の条件下でドメインを越えることができます。
2 つのサイト www.test1.com と www.test2.com が Cookie のクロスドメイン アクセスをどのように実装しているかをテストしてみましょう。 慣例によれば、ドメイン名を設定するには 2 つのトップレベル ドメイン名と DNS サーバーが必要です。そうしないと検証できませんが、ここではそれほど面倒な作業は必要ありません。ホストを変更することでシミュレーションできます。ファイル。 c:windowssystem32driversetc に hosts ファイルがあります。最後に 2 行
127.0.0.1 www.test1.com 127.0.0.1 www.test2.com
を追加すると、上記のドメイン名を使用してローカル ループバック アドレスにアクセスできます。 IIS に一連のプログラムを展開するだけで済みます。IP はローカル マシンのループバック アドレスであり、それぞれ 2 つのドメイン名を使用してアクセスできます。
Default.aspx、SSO.ashx、GetCookie.aspx という 3 つの新しいページを作成します。
このうち、Default.aspxはwww.test1.comのページで、アクセスアドレスはhttp://www.test1.com/Default.aspxです。フロントエンド コードを見てください。バックエンド コードはありません
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Admin10000.Web.Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <script type="text/javascript"> var _frm = document.createElement("iframe"); _frm.style.display = "none"; _frm.src = "http://www.test2.com/SSO.ashx"; document.body.appendChild(_frm); </script> </div> </form> </body> </html>
もう 1 つは SSO.ashx ページです。これは www.test2.com のページだと思います。フロントエンドにはあります。コードはありません。バックエンド コードは次のとおりです:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; using System.Web.SessionState; namespace Admin10000.Web { /// <summary> /// $codebehindclassname$ 的摘要说明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class SSO : IHttpHandler { public void ProcessRequest(HttpContext context) { HttpCookie cookie = new HttpCookie("name", "www.Admin10000.com"); cookie.Domain = "test2.com"; cookie.Path = "/"; cookie.Expires = DateTime.Now.AddMinutes(10000); context.Response.Cookies.Add(cookie); context.Response.ContentType = "text/plain"; context.Response.AddHeader("P3P", "CP=CAO PSA OUR"); context.Response.Write(""); } public bool IsReusable { get { return false; } } } }
最後のページは GetCookie.aspx ページです。これは www.test2.com の下のページでもあります。フロントエンド コードはなく、バックエンド コードのみです。終了コード:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace Admin10000.Web { public partial class GetCookie : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (Request.Cookies["name"] != null) { Response.Write(Request.Cookies["name"].Value); } } } }
さて、http://www.test1.com/Default.aspx にアクセスしてテストにアクセスします。その後、SSO.ashx ページが iframe を通じてロードされ、バックグラウンド コードが実行されます。 Cookie を作成するには、http://www.test2.com/GetCookie.aspx にアクセスして、対応する Cookie を取得します。 www.test1.com で作成された Cookie は、www.test2.com でアクセスできることに注意してください。
注意事項:
admin10000.com ヒント SSO.ashx のバックグラウンド コードに次の文があります。応答ヘッダー。これは、IE ブラウザでサポートされている P3P により、iframe がサイトをまたぐときに Cookie がブロックされ、Cookie を作成できないためです。 (FireFox は現在 P3P セキュリティ機能をサポートしていません。FireFox には当然この問題はありません。P3P 応答ヘッダーを追加する必要はありません。)
iframe の src 属性を使用して、test1.com の Cookie 値をリダイレクトします。 com ドメインの SSO.ashx ページで、SSO.ashx が test1.com ドメインから渡された Cookie 値を取得し、取得した値を Cookie に書き込むだけで、クロスドメイン Cookie アクセスが実現されます。 。
さらに、Default.aspx ページを JS 呼び出し形式に変更することもできます:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Admin10000.Web.Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <script type="text/javascript" src="http://www.test2.com/SSO.ashx"></script> </div> </form> </body> </html>