>  기사  >  백엔드 개발  >  쿠키 교차 도메인 문제에 관한 asp.net

쿠키 교차 도메인 문제에 관한 asp.net

伊谢尔伦
伊谢尔伦원래의
2016-11-25 09:19:281697검색

쿠키는 웹 개발자가 사용자의 로그인 상태를 유지할 수 있게 해주는 훌륭한 발명품입니다. 그러나 사이트에 도메인 이름이 두 개 이상 있으면 문제가 발생합니다. 쿠키 사양에 따르면 쿠키는 하나의 도메인 이름에만 사용할 수 있으며 다른 도메인 이름으로 보낼 수 없습니다. 따라서 하나의 도메인 이름에 대해 브라우저에 쿠키가 설정되어 있으면 해당 쿠키는 다른 도메인 이름에는 유효하지 않습니다. 사용자가 귀하의 사이트 중 하나에서 로그인하고 다른 도메인에서도 로그인하도록 하려는 경우 이는 실제 문제가 될 수 있습니다.

2차 도메인 이름 전체

우리는 쿠키가 2차 도메인 이름 전체에 액세스할 수 있다는 것을 알고 있습니다. 예를 들어, www.test1. com은 쿠키를 생성하며, bbs.test1.com과 같은 2차 도메인 이름에 해당하는 애플리케이션에 접근하려면 쿠키 생성 시 도메인 매개변수 domain=test1.com을 설정해야 합니다. asp.net을 예로 들면 코드는 다음과 같습니다.

HttpCookie cookie = new HttpCookie("name", "www.Admin10000.com");
cookie.Domain = "test1.com";
cookie.Path = "/";
Response.Cookies.Add(cookie);

교차 최상위 도메인 이름

2차 도메인 이름이 아니고 다른 상위에 있는 경우 -레벨 도메인 이름(예: www.test1.com이 위치한 곳) 웹 응용 프로그램이 쿠키를 생성하고 www.test2.com 응용 프로그램 또는 해당 두 번째 수준 도메인 이름에 액세스하려고 합니다. 어떻게 해야 합니까? 우리는 기존의 대응책으로는 접근할 수 없다는 것을 알고 있습니다. 핵심은 접근할 수 있는 방법이 있는지 확인하는 것입니다. 사실 쿠키는 마음대로 도메인 간을 달성하는 것이 아니라 특정 조건 하에서 도메인을 넘을 수 있습니다.

www.test1.com과 www.test2.com 두 사이트가 쿠키 교차 도메인 액세스를 어떻게 구현하는지 테스트해 보겠습니다. 관례에 따르면 도메인 이름을 구성하려면 최상위 도메인 이름 2개와 DNS 서버가 필요합니다. 그렇지 않으면 확인할 수 없지만 여기서는 그렇게 번거롭게 호스트를 수정하여 시뮬레이션할 수 있습니다. 파일. c:windowssystem32driversetc에 호스트 파일이 있습니다. 끝에

127.0.0.1    www.test1.com
127.0.0.1    www.test2.com

줄을 추가하면 위의 도메인 이름을 사용하여 로컬 루프백 주소에 액세스할 수 있습니다. 우리는 IIS에 일련의 프로그램을 배포하기만 하면 됩니다. IP는 로컬 컴퓨터의 루프백 주소이며 두 개의 도메인 이름을 사용하여 액세스할 수 있습니다.

Default.aspx, SSO.ashx 및 GetCookie.aspx라는 세 개의 새 페이지를 만듭니다.

여기서 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>

다른 하나는 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;
            }
        }
    }
}

마지막은 www.test2 아래의 페이지이기도 한 GetCookie.aspx 페이지입니다. .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);
            }
        }
    }
}

OK 이제 http://www.test1.com/Default에 액세스한 후 테스트에 액세스합니다. aspx를 사용하면 iframe을 통해 SSO.ashx 페이지가 로드되고 백그라운드 코드가 실행되어 쿠키가 생성된 다음 http://www.test2.com/GetCookie.aspx 해당 쿠키를 가져옵니다. www.test1.com에서 생성된 쿠키는 www.test2.com에서 액세스할 수 있습니다.

참고 사항:

admin10000.com은 SSO.ashx의 배경 코드에 다음 문장이 있다는 메시지를 표시합니다. context.Response.AddHeader("P3P", "CP=CAO PSA OUR "); P3P 응답 헤더를 설정하는 데 사용됩니다. IE 브라우저에서 지원하는 P3P로 인해 iframe 크로스 사이트 시 쿠키가 차단되어 쿠키가 생성되지 않기 때문입니다. (FireFox는 현재 P3P 보안 기능을 지원하지 않으며 FireFox에는 당연히 이 문제가 없습니다. P3P 응답 헤더를 추가할 필요가 없습니다.)

iframe의 src 속성을 사용하여 쿠키 값을 재설정합니다. test1.com 도메인을 get 매개변수로 지정합니다. test2.com 도메인 아래의 SSO.ashx 페이지로 이동하면 SSO.ashx는 test1.com 도메인에서 전달된 쿠키 값을 얻고 얻은 값을 쿠키에 씁니다. 도메인 간 쿠키 전송.

또한 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으로 문의하세요.