一、 LtpaToken组成原理
通过了解LtpaToken的组成原理,我们就可以自己编码生成和解析LtpaToken了。首先一个LtpaToken的合成公式如下:
Header: LtpaToken 版本(长度4),Domino的固定为[0x00][0x01][0x02][0x03]
n [SHA-1 hash] = SHA-1([header][creation time][expiration time][username][shared secret])
二、 Domino如何处理LtpaToken
查看一下domino的Web SSO配置文档:
1、 Domino生成LtpaToken的密钥存放在LTPA_DominoSecret字段
2、 LTPA_TokenExpiration字段存放失效分钟数。
3、 LTPA_TokenName字段存放Token表示在cookie的name
….如下图:
再加上上面分析过的LtpaToken组成原理,我们大概可以知道domino是怎么生成LtpaToken的了。详细的debug信息可以通过在notes.ini里面配置条目DEBUG_SSO_TRACE_LEVEL=2之后去查看日志。
Domino解析LtpaToken步骤:
1、 Base64解码LtpaToken。
2、 截取最前面20字节,最后面20字节,中间部分就是用户名。如果用户名在本系统中不正确,返回无效的LtpaToken。
3、 截取最后面20字节,是SHA-1校验和。用Token中的其余部分和本系统中的密钥生成新的SHA-1校验和,如果2个校验和不匹配。返回无效的LtpaToken。
4、 当前服务器时间必须大于创建时间,小于失效时间。否则返回无效的LtpaToken。
5、 最后解析通过了,完成用户的登录
6、 在Java应用上实现生成和解析LtpaToken的测试
2.1 生成LtpaToken的测试
文件列表:
Base64.java base64编码和解码的类
Bundle.java properties资源文件的处理类
LtpaConfig.java Token资料配置类。
LtpaToken.java 产生和解析LtpaToken的类
LtpaConfig_zh_CN.properties 配置文件
第一步,配置LtpaConfig_zh_CN.properties,填好ltpaSecret。这个值本身是base64编码。
如果是和domino做sso。需要从domino的web sso文档中获取,见上一张图。
tokenDomain信息是生成http cookie的时候用的,本测试中暂不用到。
tokenExpiration是生成LtpaToken时用的,本测试中暂也不用。
第二步,添加一个测试的类:
在main函数中输入以下测试代码:
newString user=;
generate(user," date="" font="" strong="" font="" style="FONT-SIZE: 10pt" color="#7f0055" face="">newSystem.out.println(generate);
CN=Admin/O=S3D生成一个LtpaToken。
输出:
<FONT style="FONT-SIZE: 10pt" color="black" face=""">
到domino去验证Token的有效性:
1、 复制上面产生的Token.
2、 打开IE,输入Domino服务器的首页地址:http://devp.s3d.com/
3、 出现登录页面,这里不输入用户名和密码。直接在IE地址栏里面输入:
javascript:alert(document.cookie="LtpaToken=AAECAzRCOTlEOTQxNEI5OURERjFDTj1BZG1pbi9PPVMzRKb6cFIxqIX+lGjQhDDWaeN4IvXe");
以上红色部分是复制的Token
4、 弹出对话框,cookie设置成功,按F5刷新页面,成功以Admin身份登录Domino主页,LtpaToken测试成功。
2.2 解析LtpaToken的测试
下面测试解析一个由Domino产生的LtpaToken。
1、 打开一个新的IE窗口,输入Domino服务器的首页地址:http://devp.s3d.com/
2、 输入一个普通用户的帐号/密码,正常进入首页。
3、 在IE地址栏输入:javascript:document.write(document.cookie)
4、 复制出Cookie中的LtpaToken的值,如:
AAECAzRCOTlEQTZGNEI5QTgzMkZDTj1saXVnYW5nMi9PPWVzc2VuY2VzZNmGPcgH0NQxnrhgnn1/JrPkHgg=
在测试类中添加以下测试代码:
new"AAECAzRCOTlEQTZGNEI5QTgzMkZDTj1saXVnYW5nMi9PPWVzc2VuY2VzZNmGPcgH0NQxnrhgnn1/JrPkHgg=" token中取出用户名
out token是否有效
if System..println(<FONT style="FONT-SIZE: 10pt" color="#2a00ff" face=""">"token是有效的<FONT style="FONT-SIZE: 10pt" color="#2a00ff" face=""">" }
输出以下内容:
到这里,解析LtpaToken测试成功。
7、 总结
LtpaToken非常安全方便,不失为一种较好的SSO解决方案。
1、 通过以上对LtpaToken的了解:可以给大多数B/S应用配置使用基于LtpaToken的SSO。
本文地址:http://blog.youkuaiyun.com/titanzhi/article/details/5754543 转发请注明出处及原作者