如何实现RTX与OA单点登陆?
悬赏: 10 积分 提问于:2009-03-25 14:31:44 点击数:
如何实现RTX与OA单点登陆?
提问者: RTX用户 - 童生 [1]最佳答案
1. 从OA到RTX的单点登陆
•1.1. 原理
1. OA系统客户端登陆,OA系统服务端验证其客户端的合法性,允许其登陆;
2. OA系统服务端通过RTX Server SDK获取一个该用户的session key;
3. OA系统将session key传到OA的客户端;
4. OA的客户端(如果是浏览器,就使用客户端脚本语言)通过调用RTX客户端,传入用户名和session key作为密码(即是不需要输入密码)登录RTX服务器;
5. RTX服务器验证用户名和session key有效(正确且不超时)就会让RTX客户端客户自动登陆。
这里的session key,不是用户密码,是RTX服务器端临时生成的一个长字符串,是有一定时效的,一旦失效,就不能用它登陆了。
•1.2. 服务器端接口说明
接口属于老接口:IRTXObject::Call2()
对象名称:SYSTOOLS
命令代码:0x2000
说明:获取SessionKey,用于单点登录时,从Server端获取登录的密钥。
属性描述
USERNAME登录者,RTX中的用户名称或用户号码,必填参数。
返回值
错误抛出COM异常,否则返回登录密钥字符串。
•1.3. 客户端接口说明
接口属于客户端的老接口:RTXAPI::Call()
命令名:CMD_LDAP_Login(注意:这个就是单点登录命令)
说明:RTXAPI对象Call方法的CMD_LDAP_Login命令,是由用户名来登录指定的服务器,实现"单点登录原理"。
格式:Call( CMD_LDAP_Login, Property );
Property参数一属性容器对象,需要按如下列表封入各参数值。
属性描述:
RTXUserName登录的RTX用户名;
LoginSessionKey登录密码,调用Server SDK API获得的session key;
ServerAddress指RTX服务器所在的地址;
ServerPort 指RTX服务器的端口号。
•1.4. 程序示例
•1.4.1. 服务器端程序
方法一:使用老接口
txtResult.value = ""
RTXObj.Name = "SYSTOOLS"
RTXParams.Add "USERNAME", txtUser.value
On error resume next
RTXResult = RTXobj.Call2(&H2000, RTXParams)
if( err.number < 0) then
RTXResult = err.Description
txtResult.value = RTXResult
exit sub
end if
txtResult.value = "操作成功"
txtSessionKey.value = RTXResult
global_session_key = RTXResult
方法二:使用新接口
Set RootObj = createobject("RTXSAPIRootObj.RTXSAPIRootObj") '创建Root对象
Set UserAuthObj2 =RootObj.UserAuthObj '通过根对象创建UserAuthObj2
RootObj.ServerIP = txtServerIP.value '服务器端口
RootObj.ServerPort = txtServerPort.value '设置服务器端口
dim sessionkey
sessionkey = UserAuthObj2.GetSessionKey(txtUser.value) '验证用户签名
MsgBox "sessionky: " & sessionkey
•1.4.2. 客户端程序
Private Sub cmdLogin_Click()
Dim CMD_LDAP_Login As Integer
Set CMD_LDAP_Login = 2
Dim objAPI As RTXClient.RTXAPI
Set objAPI = CreateObject("RTXClient.RTXAPI")
Dim objProp As Object
On Error GoTo ProcedureName_Err
Set objProp = objAPI.GetObject("Property")
objProp.Value("RTXUsername") = "user1"
objProp.Value("LoginSessionKey") = GetSessionKey()
objProp.Value("ServerAddress") = "127.0.0.1"
objProp.Value("ServerPort") = 8000
On Error GoTo ProcedureName_Err
objAPI.Call CMD_LDAP_Login, objProp
ProcedureName_Err:
If Err.Description <> "" Then
MsgBox "Error # " & CStr(Err.Number) & " " & Err.Description
Err.Clear ' Clear the error.
End If
Set objProp = Nothing
Set objAPI = Nothing
End Sub
上面是vb的代码,GetSessionKey()的方法是服务器端的被省略了,RTX服务器被设置为本机,登陆端口是默认的。
•1.5. 附件
附件是sessionkey.htm文件是vbscript的代码,使用的是老接口,因为同时包含了服务器端和客户端的代码,所以必须保证RTX服务器、RTX客户端在一台服务器,该文件也在这台机器上,而且也在同一台计算机上打开浏览器才能正确执行获取session key登陆的全过程。如果要正式使用,该文件中的代码必须修改!
如果要修改为其它服务器,客户端程序运行需要修改输入框的服务器地址。而本机需要安装RTX Server SDK和RTX客户端。
如果使用的是老接口,还需要修改RTX服务器安装目录下的SDKProperty.xml文件,把本机的IP地址加入。
例如本机地址为172.30.21.20,配置如下所示:
<?xml version="1.0"?>
<Property>
<APIClient>
<IPLimit Enabled="1">
<IP>127.0.0.1</IP>
</IPLimit>
</APIClient>
<sdkhttp>
<IPLimit Enabled="1">
</IPLimit>
</sdkhttp>
</Property>
配置完之后需要重启RTX服务器,如果有防火墙的话,还要开放相关端口,默认是6000。
而服务器端程序的跨服务器调用老接口的说明,请参考RTX Server SDK帮助和《RTX与其他应用系统集成的常见问题》。
如果使用的是新接口,还需要修改RTX服务器安装目录下的AppConnConfig.xml文件,把本机的IP地址加入。
例如本机地址为172.30.21.20,配置如下所示:
<?xml version="1.0"?>
<Property>
<APIClient>
<IPLimit Enabled="1">
<IP>127.0.0.1</IP>
<IP>172.30.21.20</IP>
</IPLimit>
</APIClient>
</Property>
配置完之后需要重启RTX服务器,如果有防火墙的话,还要开放相关端口,默认是8006。
关于服务器端程序的跨服务器调用新接口的更多的说明,请参考RTX Server SDK帮助和《RTX与其他应用系统集成的常见问题》。
•2. 从RTX到OA的单点登陆
•2.1. 原理
用户想登录RTX后,登录他们自身的系统不需要再认证就可以直接登录,利用RTX作为用户密码验证。具体过程如下:
1. RTX客户端输入用户名和密码正常登录RTX服务器;
2. OA客户端(也可能是IE浏览器)通过RTX Client SDK接口获取签名;
3. OA客户端(也可能是IE浏览器)将用户名及签名发给OA服务器;
4. OA服务器调用RTX Server SDK验证签名是否正确;
5. RTX Server返回验证结果给OA服务器;
6. OA服务器返回验证结果应用客户端,如果正确,则登录成功。
2.2. 客户端接口
2.2.1. 获取当前用户的账号
HRESULT IRTXCRoot::get_Account([out, retval] BSTR *pVal);
参数:
pVal[out]包含当前用户账号的 BSTR 类型指针
返回值:
S_OK:方法调用成功
E_FAIL:方法调用失败
•2.2.2. 获取当前用户的签名
HRESULT IRTXCRoot::get_Sign([out, retval] IRTXCData **pVal);
参数:
pVal[out] 包含 IRTXCData* 接口类型的指针
返回值:
S_OK:方法调用成功
E_FAIL:方法调用失败
•2.3. 服务器端接口
HRESULT IRTXSAPIUserAuthObj::SignatureAuth([in] BSTR bstrUserName, [in] BSTR bstrSign, [out, retval] VARIANT_BOOL* pbSuccess);
参数:
[in] BSTR bstrUserName 用户名
[in] BSTR bstrSign 经过 base64 编码的签名
[out] VARIANT_BOOL* pbSuccess 验证结果,成功为True,否则为 False。
返回值:
方法调用成功返回 S_OK ,否则返回其他错误返回值。
•2.4. 程序示例
•2.4.1. 客户端程序
Function GetSignature() '客户端脚本,用于获取用户帐号与签名
on error resume next
Set RTXCRoot = RTXAX.GetObject("KernalRoot") ' 获取KernalRoot对象
Set rtcData = RTXCRoot.Sign '获取签名,并把它赋给rtcData
strAccount = RTXCRoot.Account '获取用户帐号
strSignature = rtcData.GetString("Sign") '获取rtcData对象的Sign 的内容,就是用户签名
If Err.Number <> 0 Then
MsgBox "Error # " & CStr(Err.Number) & " " & Err.Description
Err.Clear ' Clear the error.
End If
End Function
•2.4.2. 服务器端程序
Set RootObj = createobject("RTXSAPIRootObj.RTXSAPIRootObj") '创建Root对象
Set UserAuthObj2 =RootObj.UserAuthObj '通过根对象创建UserAuthObj2
RootObj.ServerIP = "127.0.0.1" '服务器端口
RootObj.ServerPort = 8006 '设置服务器端口
bSucc = UserAuthObj2.SignatureAuth(strAccount, strSignature) '验证用户签名
If bSucc = True Then
MsgBox "验证成功"
Else
MsgBox "验证失败"
End If
If Err.Description <> "" Then
MsgBox "Error # " & CStr(Err.Number) & " " & Err.Description
Err.Clear ' Clear the error.
End If
•2.5. 附件
附件signature.htm是文件是vbscript的代码,因为同时包含了服务器端和客户端的代码,所以必须保证RTX服务器、RTX Server SDK、RTX客户端在一台服务器,该文件也在这台机器上,而且也在同一台计算机上打开浏览器才能正确执行获取签名,验证签名的全过程。如果要正式使用,该文件中的代码必须修改!
如果要修改为其它服务器,服务器程序运行需要修改输入框的服务器地址。而本机需要安装RTX Server SDK和RTX客户端。还需要修改RTX服务器安装目录下的AppConnConfig.xml文件,把本机的IP地址加入。
例如本机地址为172.30.21.20,配置如下所示:
<?xml version="1.0"?>
<Property>
<APIClient>
<IPLimit Enabled="1">
<IP>127.0.0.1</IP>
<IP>172.30.21.20</IP>
</IPLimit>
</APIClient>
</Property>
配置完之后需要重启RTX服务器,如果有防火墙的话,还要开放相关端口,默认是8006。
关于服务器端程序的跨服务器调用新接口的更多的说明,请参考RTX Server SDK帮助和《RTX与其他应用系统集成的常见问题》。
•3. 附件示例的再说明
Web的代码通常分为两部分,服务器运行的代码,如果是ASP通常用<%%>号括起来代码表示在服务器端运行;通常VBScript写的是客户端的代码。本文的附件示例为了简便,把两部分代码写在同一个文件,结果很多人都不理解这一点,拿了就用。实际环境必须把获取session key写为服务器端的代码,客户端代码可以用response.write把登录的代码输出到页面让IE浏览器能看到。
下面是一个SessionKeySvr.asp代码的片段,与附件示例相同,获取SessionKey在ASP服务器端完成。之后把RTX客户端登录的VBScript代码输出到页面,IE浏览器会执行这部分代码实现登录。
<%
strSender =Request.Form("user")
on error resume next
Set RootObj = createobject("RTXSAPIRootObj.RTXSAPIRootObj") '创建Root对象
Set UserAuthObj = RootObj.UserAuthObj '获取UserAuth对象
RootObj.ServerIP = "172.30.21.229" '服务器地址
RootObj.ServerPort = 8006 '设置服务器端口
strSessionKey = UserAuthObj.GetSessionKey(strSender) '获取SessionKey
severip = "172.30.21.229"
serverport = 8000
line01 = "Set objProp = RTXAX.GetObject(""Property"")" & chr(13)
line02 = "objProp.Value(""RTXUsername"") = txtSessionKeyLoginName.value" & chr(13)
line03 = "objProp.Value(""LoginSessionKey"") = ""strSessionKey """ & chr(13)
line04 = "objProp.Value(""ServerAddress"") = ""172.30.21.229""" & chr(13)
line05 = "objProp.Value(""ServerPort"") = 8006" & chr(13)
line06 = "msgbox ""sessionkey: "" & ""strSessionKey """ & chr(13)
line07 = "RTXAX.Call 2, objProp" & chr(13)
response.write (line01)
...
%>
至于签名验证也是类似的。
•1.1. 原理
1. OA系统客户端登陆,OA系统服务端验证其客户端的合法性,允许其登陆;
2. OA系统服务端通过RTX Server SDK获取一个该用户的session key;
3. OA系统将session key传到OA的客户端;
4. OA的客户端(如果是浏览器,就使用客户端脚本语言)通过调用RTX客户端,传入用户名和session key作为密码(即是不需要输入密码)登录RTX服务器;
5. RTX服务器验证用户名和session key有效(正确且不超时)就会让RTX客户端客户自动登陆。
这里的session key,不是用户密码,是RTX服务器端临时生成的一个长字符串,是有一定时效的,一旦失效,就不能用它登陆了。
•1.2. 服务器端接口说明
接口属于老接口:IRTXObject::Call2()
对象名称:SYSTOOLS
命令代码:0x2000
说明:获取SessionKey,用于单点登录时,从Server端获取登录的密钥。
属性描述
USERNAME登录者,RTX中的用户名称或用户号码,必填参数。
返回值
错误抛出COM异常,否则返回登录密钥字符串。
•1.3. 客户端接口说明
接口属于客户端的老接口:RTXAPI::Call()
命令名:CMD_LDAP_Login(注意:这个就是单点登录命令)
说明:RTXAPI对象Call方法的CMD_LDAP_Login命令,是由用户名来登录指定的服务器,实现"单点登录原理"。
格式:Call( CMD_LDAP_Login, Property );
Property参数一属性容器对象,需要按如下列表封入各参数值。
属性描述:
RTXUserName登录的RTX用户名;
LoginSessionKey登录密码,调用Server SDK API获得的session key;
ServerAddress指RTX服务器所在的地址;
ServerPort 指RTX服务器的端口号。
•1.4. 程序示例
•1.4.1. 服务器端程序
方法一:使用老接口
txtResult.value = ""
RTXObj.Name = "SYSTOOLS"
RTXParams.Add "USERNAME", txtUser.value
On error resume next
RTXResult = RTXobj.Call2(&H2000, RTXParams)
if( err.number < 0) then
RTXResult = err.Description
txtResult.value = RTXResult
exit sub
end if
txtResult.value = "操作成功"
txtSessionKey.value = RTXResult
global_session_key = RTXResult
方法二:使用新接口
Set RootObj = createobject("RTXSAPIRootObj.RTXSAPIRootObj") '创建Root对象
Set UserAuthObj2 =RootObj.UserAuthObj '通过根对象创建UserAuthObj2
RootObj.ServerIP = txtServerIP.value '服务器端口
RootObj.ServerPort = txtServerPort.value '设置服务器端口
dim sessionkey
sessionkey = UserAuthObj2.GetSessionKey(txtUser.value) '验证用户签名
MsgBox "sessionky: " & sessionkey
•1.4.2. 客户端程序
Private Sub cmdLogin_Click()
Dim CMD_LDAP_Login As Integer
Set CMD_LDAP_Login = 2
Dim objAPI As RTXClient.RTXAPI
Set objAPI = CreateObject("RTXClient.RTXAPI")
Dim objProp As Object
On Error GoTo ProcedureName_Err
Set objProp = objAPI.GetObject("Property")
objProp.Value("RTXUsername") = "user1"
objProp.Value("LoginSessionKey") = GetSessionKey()
objProp.Value("ServerAddress") = "127.0.0.1"
objProp.Value("ServerPort") = 8000
On Error GoTo ProcedureName_Err
objAPI.Call CMD_LDAP_Login, objProp
ProcedureName_Err:
If Err.Description <> "" Then
MsgBox "Error # " & CStr(Err.Number) & " " & Err.Description
Err.Clear ' Clear the error.
End If
Set objProp = Nothing
Set objAPI = Nothing
End Sub
上面是vb的代码,GetSessionKey()的方法是服务器端的被省略了,RTX服务器被设置为本机,登陆端口是默认的。
•1.5. 附件
附件是sessionkey.htm文件是vbscript的代码,使用的是老接口,因为同时包含了服务器端和客户端的代码,所以必须保证RTX服务器、RTX客户端在一台服务器,该文件也在这台机器上,而且也在同一台计算机上打开浏览器才能正确执行获取session key登陆的全过程。如果要正式使用,该文件中的代码必须修改!
如果要修改为其它服务器,客户端程序运行需要修改输入框的服务器地址。而本机需要安装RTX Server SDK和RTX客户端。
如果使用的是老接口,还需要修改RTX服务器安装目录下的SDKProperty.xml文件,把本机的IP地址加入。
例如本机地址为172.30.21.20,配置如下所示:
<?xml version="1.0"?>
<Property>
<APIClient>
<IPLimit Enabled="1">
<IP>127.0.0.1</IP>
</IPLimit>
</APIClient>
<sdkhttp>
<IPLimit Enabled="1">
</IPLimit>
</sdkhttp>
</Property>
配置完之后需要重启RTX服务器,如果有防火墙的话,还要开放相关端口,默认是6000。
而服务器端程序的跨服务器调用老接口的说明,请参考RTX Server SDK帮助和《RTX与其他应用系统集成的常见问题》。
如果使用的是新接口,还需要修改RTX服务器安装目录下的AppConnConfig.xml文件,把本机的IP地址加入。
例如本机地址为172.30.21.20,配置如下所示:
<?xml version="1.0"?>
<Property>
<APIClient>
<IPLimit Enabled="1">
<IP>127.0.0.1</IP>
<IP>172.30.21.20</IP>
</IPLimit>
</APIClient>
</Property>
配置完之后需要重启RTX服务器,如果有防火墙的话,还要开放相关端口,默认是8006。
关于服务器端程序的跨服务器调用新接口的更多的说明,请参考RTX Server SDK帮助和《RTX与其他应用系统集成的常见问题》。
•2. 从RTX到OA的单点登陆
•2.1. 原理
用户想登录RTX后,登录他们自身的系统不需要再认证就可以直接登录,利用RTX作为用户密码验证。具体过程如下:
1. RTX客户端输入用户名和密码正常登录RTX服务器;
2. OA客户端(也可能是IE浏览器)通过RTX Client SDK接口获取签名;
3. OA客户端(也可能是IE浏览器)将用户名及签名发给OA服务器;
4. OA服务器调用RTX Server SDK验证签名是否正确;
5. RTX Server返回验证结果给OA服务器;
6. OA服务器返回验证结果应用客户端,如果正确,则登录成功。
2.2. 客户端接口
2.2.1. 获取当前用户的账号
HRESULT IRTXCRoot::get_Account([out, retval] BSTR *pVal);
参数:
pVal[out]包含当前用户账号的 BSTR 类型指针
返回值:
S_OK:方法调用成功
E_FAIL:方法调用失败
•2.2.2. 获取当前用户的签名
HRESULT IRTXCRoot::get_Sign([out, retval] IRTXCData **pVal);
参数:
pVal[out] 包含 IRTXCData* 接口类型的指针
返回值:
S_OK:方法调用成功
E_FAIL:方法调用失败
•2.3. 服务器端接口
HRESULT IRTXSAPIUserAuthObj::SignatureAuth([in] BSTR bstrUserName, [in] BSTR bstrSign, [out, retval] VARIANT_BOOL* pbSuccess);
参数:
[in] BSTR bstrUserName 用户名
[in] BSTR bstrSign 经过 base64 编码的签名
[out] VARIANT_BOOL* pbSuccess 验证结果,成功为True,否则为 False。
返回值:
方法调用成功返回 S_OK ,否则返回其他错误返回值。
•2.4. 程序示例
•2.4.1. 客户端程序
Function GetSignature() '客户端脚本,用于获取用户帐号与签名
on error resume next
Set RTXCRoot = RTXAX.GetObject("KernalRoot") ' 获取KernalRoot对象
Set rtcData = RTXCRoot.Sign '获取签名,并把它赋给rtcData
strAccount = RTXCRoot.Account '获取用户帐号
strSignature = rtcData.GetString("Sign") '获取rtcData对象的Sign 的内容,就是用户签名
If Err.Number <> 0 Then
MsgBox "Error # " & CStr(Err.Number) & " " & Err.Description
Err.Clear ' Clear the error.
End If
End Function
•2.4.2. 服务器端程序
Set RootObj = createobject("RTXSAPIRootObj.RTXSAPIRootObj") '创建Root对象
Set UserAuthObj2 =RootObj.UserAuthObj '通过根对象创建UserAuthObj2
RootObj.ServerIP = "127.0.0.1" '服务器端口
RootObj.ServerPort = 8006 '设置服务器端口
bSucc = UserAuthObj2.SignatureAuth(strAccount, strSignature) '验证用户签名
If bSucc = True Then
MsgBox "验证成功"
Else
MsgBox "验证失败"
End If
If Err.Description <> "" Then
MsgBox "Error # " & CStr(Err.Number) & " " & Err.Description
Err.Clear ' Clear the error.
End If
•2.5. 附件
附件signature.htm是文件是vbscript的代码,因为同时包含了服务器端和客户端的代码,所以必须保证RTX服务器、RTX Server SDK、RTX客户端在一台服务器,该文件也在这台机器上,而且也在同一台计算机上打开浏览器才能正确执行获取签名,验证签名的全过程。如果要正式使用,该文件中的代码必须修改!
如果要修改为其它服务器,服务器程序运行需要修改输入框的服务器地址。而本机需要安装RTX Server SDK和RTX客户端。还需要修改RTX服务器安装目录下的AppConnConfig.xml文件,把本机的IP地址加入。
例如本机地址为172.30.21.20,配置如下所示:
<?xml version="1.0"?>
<Property>
<APIClient>
<IPLimit Enabled="1">
<IP>127.0.0.1</IP>
<IP>172.30.21.20</IP>
</IPLimit>
</APIClient>
</Property>
配置完之后需要重启RTX服务器,如果有防火墙的话,还要开放相关端口,默认是8006。
关于服务器端程序的跨服务器调用新接口的更多的说明,请参考RTX Server SDK帮助和《RTX与其他应用系统集成的常见问题》。
•3. 附件示例的再说明
Web的代码通常分为两部分,服务器运行的代码,如果是ASP通常用<%%>号括起来代码表示在服务器端运行;通常VBScript写的是客户端的代码。本文的附件示例为了简便,把两部分代码写在同一个文件,结果很多人都不理解这一点,拿了就用。实际环境必须把获取session key写为服务器端的代码,客户端代码可以用response.write把登录的代码输出到页面让IE浏览器能看到。
下面是一个SessionKeySvr.asp代码的片段,与附件示例相同,获取SessionKey在ASP服务器端完成。之后把RTX客户端登录的VBScript代码输出到页面,IE浏览器会执行这部分代码实现登录。
<%
strSender =Request.Form("user")
on error resume next
Set RootObj = createobject("RTXSAPIRootObj.RTXSAPIRootObj") '创建Root对象
Set UserAuthObj = RootObj.UserAuthObj '获取UserAuth对象
RootObj.ServerIP = "172.30.21.229" '服务器地址
RootObj.ServerPort = 8006 '设置服务器端口
strSessionKey = UserAuthObj.GetSessionKey(strSender) '获取SessionKey
severip = "172.30.21.229"
serverport = 8000
line01 = "Set objProp = RTXAX.GetObject(""Property"")" & chr(13)
line02 = "objProp.Value(""RTXUsername"") = txtSessionKeyLoginName.value" & chr(13)
line03 = "objProp.Value(""LoginSessionKey"") = ""strSessionKey """ & chr(13)
line04 = "objProp.Value(""ServerAddress"") = ""172.30.21.229""" & chr(13)
line05 = "objProp.Value(""ServerPort"") = 8006" & chr(13)
line06 = "msgbox ""sessionkey: "" & ""strSessionKey """ & chr(13)
line07 = "RTXAX.Call 2, objProp" & chr(13)
response.write (line01)
...
%>
至于签名验证也是类似的。
回答者:
柯南道尔 -
举人 [3]
03-26 14:07
我来评论>>
提问者对于答案的评价:
.