当前位置: 移动技术网 > IT编程>开发语言>.net > asp.net关于Cookie跨域(域名)的问题

asp.net关于Cookie跨域(域名)的问题

2017年12月12日  | 移动技术网IT编程  | 我要评论

夏日之诗,功夫老妈国语,男子扫墓发现洞口 沉头一看被吓傻!

跨二级域名
  我们知道cookie是可以跨二级域名来访问,这个很好理解,例如你 www.test1.com 在的web应用程序创建了一个cookie,要想在bbs.test1.com这样的二级域名对应的应用程序中访问,就必须你在创建cookie的时候设置domain参数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 或其二级域名的应用程序中访问,改怎么办呢?我们知道靠常规反的方法是访问不了的,关键我们就是看看有没有方法可以访问。事实是cookie可以在一定条件下跨域,而不是随心所欲的实现跨域。

  我们来做个测试,看看两个站点 www.test1.com 和 www.test2.com 如何实现cookie跨域访问。 按照常规我们需要有2个顶级域名,并且有dns服务器才能够配置域名,否则我们是无法验证的,但是这里我们也没有必要那么麻烦,我们可以通过修改hosts文件来模拟。在 c:\windows\system32\drivers\etc 中有 hosts文件,在末尾添加上

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;
            }
        }
    }
}


最后是 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 之后,这时会通过iframe载入调用sso.ashx这个页面,执行后台代码创建cookie,然后访问 http://www.test2.com/getcookie.aspx  我们得到了相应的cookie。说明在www.test1.com下创建的cookie在www.test2.com下是可以访问到的。

要注意的地方:
  admin10000.com 提示 sso.ashx 的后台代码中有一句:context.response.addheader("p3p", "cp=cao psa our"); 是用来设置p3p响应头。是因为ie浏览器支持的p3p导致iframe跨站点时cookie被阻止,无法创建cookie。(firefox目前还不支持p3p安全特性,firefox自然也不存在此问题。不需要添加p3p响应头。)

  通过iframe的src属性将test1.com域下的cookie值作为get参数重定向到test2.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>

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网