asp.net关于Cookie跨域的问题


本文摘自PHP中文网,作者伊谢尔伦,侵删。

Cookie是一个伟大的发明,它允许Web开发者保留他们的用户的登录状态。但是当你的站点有一个以上的域名时就会出现问题了。在Cookie规范上说,一个cookie只能用于一个域名,不能够发给其它的域名。因此,如果在浏览器中对一个域名设置了一个cookie,这个cookie对于其它的域名将无效。如果你想让你的用户从你的站点中的其中一个进行登录,同时也可以在其它域名上进行登录,这可真是一个大难题。

跨二级域名

  我们知道cookie是可以跨二级域名来访问,这个很好理解,例如你 www.test1.com 在的web应用程序创建了一个cookie,要想在bbs.test1.com这样的二级域名对应的应用程序中访问,就必须你在创建cookie的时候设置domain参数domain=test1.com。 以asp.net为例 代码如下:

1

2

3

4

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文件,在末尾添加上

1

2

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。看一下前台代码,它没有任何后台代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

<%@ 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 的页面,前台没有任何代码,后台代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

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下的页面,没有前台代码,只有后台代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

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下是可以访问到的。

要注意的地方:

阅读剩余部分

相关阅读 >>

asp.net(一)基础三层框架项目:web服务器、业务服务器、数据库服务器

.net存储pdf、word和excel到数据库的方法详解

极客学院asp.net视频教程的资料推荐

asp.net中的参数与特殊类型的实例详解

asp.net中关于webapi与ajax进行跨域数据交互时cookies数据的传递

详解有关asp.net mvc 动态编译生成controller的方法

通过typings完成vs code的提示功能的实例详解

asp.net实现群发邮件功能实例教程

asp.net实现省市二级联动功能的实例代码

画图形验证码的asp代码实例

更多相关阅读请进入《asp.net》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...