跨域单点登录实现(使用iframe)
2011-12-26 18:15

目前来说,据我的认识貌似必须使用iframe 提交表单的方式,ajax方式下无法写cookie(get请求除外)。

原理上很简单,但实现起来还是走了不少弯路,各种浏览器处理方式不一样也增加了调试的难度;几经曲折终于找到了一个相对合理的实现。

上代码:

<!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>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>跨站单点登录</title>

<script language="javascript" type="text/javascript" src="http://t.zoukankan.com/jquery-1.4.1.min.js"></script>

<script language="javascript" type="text/javascript">
$(function () {
$('#btnajax').click(function () {

$("#isso").remove();
//动态框架
var $frame = $('<iframe name="isso" id="isso">');

//跨站表单
var $demo = $('<form method="post" name="form1" action="http://127.0.0.1/demo/default.aspx"type="text" name="username" value="admin"/><input type="text" name="password" value="123"/></form>');//帐号信息可以写在配置文件或者数据库中,动态获取

$('body').append($frame);

//延迟执行
setTimeout(function () {
$("#isso").contents().find('body').html($demo );//创建表单
$("#isso").contents().find('form').submit();//提交表单
}, 10);

});
});

</script>
</head>
<body>
<input id="btnajax" type="button" value="跨站请求" />
<iframe id="isso" name="isso" ></iframe>
</body>

</html>

调试情况说明:

1.chrome浏览器下成功通过(这点很赞!)

2.ie浏览器cookie被阻止,无法传递session,导致无法登录

问题原因,ie浏览器支持的P3P协议默认阻止第三方无隐私安全声明的cookie。
解决办法:将ie浏览器中的隐私策略调至“低”等级一下
或者加入P3P头部说明

1) IIS的服务器

增加一个网站http头来解决问题
管理 工具——〉选择一个网站 ——〉属性——〉http头,增加一个http头
然后输入头名:P3P

输入头内容:CP=CAO PSA OUR

2) jsp页面:

<%
response.setHeader("P3P","CP=CAO PSA OUR");
%>

3. https 跨域证书错误提示导致无法通过,解决办法:

1) 将证书安装,选择存储区域“受信任的根证书颁发机构”
2) Internet 选项 高级里面 去掉 “对证书地址不匹配发出警告”

另外,对于过期的证书,目前还没有办法,建议重新生成证书。

相关文件下载跨站单点登录.7z

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。