热点问答:为什么客户腾讯通RTXRTX Server如何实现RTRTX组织架Java调用RTRTX服务器用友U8客户如何实现一RTX是否有L ...

您所在的位置:问答 > RTX二次开发 > 查看问题

如何实现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) 

... 



%> 



至于签名验证也是类似的。 
回答者: 柯南道尔 - 举人 [3] 03-26 14:07

我来评论>>

提问者对于答案的评价:

.

(共 0 个回答) 网友回答