ホームページ  >  記事  >  バックエンド開発  >  asp.net の Cookie クロスドメインの問題について

asp.net の Cookie クロスドメインの問題について

伊谢尔伦
伊谢尔伦オリジナル
2016-11-25 09:19:281748ブラウズ

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>


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。