跨域单点登录实现(使用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="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" style="display:none">');
//跨站表单
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" style="display:none" ></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