IBM跨域认证简单解决方案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
跨域认证简单解决方案-使用第三方Cookie
概述
跨域认证,意味着用户在一个入口登录后可以无障碍的漫游到其它信任域。也就是所谓的单点登录(SSO)。对于大型的服务提供着,常用的方法有:使用安全断言标记语言(SAML)、基于公开密钥技术(PKI-Pubic Key Infrastructure)的Kerberos网络认证协议或者使用Windows采用的认证方案LanManager认证(称为LM协议-对于NT 安装Service Pack4以后采用NTLM v2版本)。这些认证方式需要单独的认证服务器,对于普通的使用者来说,既难已实现,也不太可能搭建单独的服务器。有没有一种简单又安全的认证方式呢?
本文的目标
使用Cookie和SHA1结合实现简单又安全的认证,如用户在中登录后,无需再次登录就可以
直接使用中提供的服务。
Cookie是什么
Cookie 是由Web 站点创建的小文本文件,存储在您的计算机上。这样,当您下一次访问该站点时,它可以自动获取有关您的信息,例如浏览喜好,或您的姓名、地址及电话号码。
关键词
SSO(Single Sign-On)-单点登录
SAML(Security Assertions Markup Language)-安全断言标记语言
Cross-Realm Authentication -跨域认证
PKI(Pubic Key Infrastructure)-公开密钥技术
SHA1(Secure Hash Algorithm 1)-安全哈希算法1
P3P(The Platform for Privacy Preferences)隐私参数选择平台
单一认证模型
1、用户使用a_logon.aspx登录服务器
2、在a_logon.aspx中自动嵌入iframe其src指向的b_auth.php
3、认证成功后在客户端写入Cookie,通过iframe调用b_auth.php 传递认证参数(经过SHA1后)
4、b_auth.php认证成功后在客户端写入认证Cookie
5、完成和的统一认证
问题:
上面提到的过程如果使用FireFox浏览器b_auth.php能够成功写入Cookie,如果使用IE6.0及
以上版本b_auth.php写入Cookie失败。
原因:
IE 6.0支持P3P,IE 6的缺省隐私等级设置为"中"——即"阻止没有合同隐私策略的第三方
cookie"。而在用户浏览a_logon.aspx时写入的为第一方Cookie,其嵌入的iframe指向
b_auth.php
这时写入的就为第三方Cookie了,所以它是被IE当在了大门外。
解决方法:
让用户改变IE安全策略,允许第三方Cookie,这似乎很简单,可是用户会听你的吗?另一种
解决方法使用P3P,在b_auth.php中添加P3P头。网上google一下好像很多,本着不求甚解的原则 Copy来就是了。如下:
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"')
实现代码
a_logon.aspx(C#伪代码)
//////////////////////////////
if( !Page.IsPostBack )
return;
if( VerifyPassword( sPwd ) )
{
string sSalt = CreateSalt(12);
Session.Add("User",sName);
Session.Add("Salt",sSalt);
string sHash = Hash( sName+sPwd + sSalt,"SHA1");
Session.Add("Passport",sHash);
string sR = "
src='/b_auth.php?name=%sName%&salt=%sSalt%&passport=%sHash%'
width='0' height='0'> ";
Response.Write( sR);
}
/////////////////////////////////////////////
b_auth.php
----------------------------------------
//---------------------------
// cookie auth in multi-domain
// Author: Lazen lau
// Mail: lazen_cn@
// History:
// 2007-05-17 10:00 release 1.0
// Copyright (C) 2007
//---------------------------
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"'); $user = $_REQUEST['name']; $salt = $_REQUEST['salt']; $passport = $_REQUEST['passport'];
$hr = "auth failed";
if( !empty($passport))
{
//get usr pwd
$pwd = "888888";
//md5
$src = $user.$pwd.$salt;
$auth = strtoupper(sha1($src));
if( $auth == $passport )
{
setcookie("ticket",$passport);
$hr = "auth suc";