本文介绍了在国家安全法发布和产品升级背景下,对第三方系统登录授权安全性进行升级的措施,包括将签名加密算法升级为SHA256以防止暴力破解。详细说明了第三方系统单点登录的配置选项,如允许全部用户或指定用户登录,以及链接的有效性和使用次数。同时,提供了生成签名授权URL的参数格式和说明,并展示了NET示例代码。此外,还介绍了从第三方系统注销用户的接口地址和参数,以及处理中文编码问题的配置方法。最后,提供了知识扩展链接和问题处理建议。
背景:国家安全法发布,产品升级,安全策略进行调整,第三方系统登录授权安全性进行升级,将生成签名加密算法升级为SHA256,防止暴力破解
支持补丁:2022年5月补丁
1.启用第三方系统登录授权
2 测试第三方系统单点登陆
允许全部用户登录:此应用ID、应用密钥 允许二开自定义登录链接,允许所有用户登录
指定用户登录:此应用ID、应用密钥 允许二开自定义登录链接,但只允许列表中用户进行登录
连接有效性:
链接仅供使用一次: 生成链接只允许登录一次
支持链接重复使用:生成的链接允许使用多次进行登录
3 在第三方系统中生成签名授权的URL
【参数格式】:ud=
{"dbid":"61cd78fbc6aa78","username":"zhangsan","appid":"BMMailApprovalApp","signeddata":"230bff1feb781****3458d30f37f17c824a8a5f30417608ca2ccfe1140bec9f2","timestamp":"1649726187","lcid":"2052","origintype":"SimPas","entryrole":"","formid":"","formtype":"","pkid":"","openmode":null}
【参数说明】:
dbid:数据中心的ID;
username:用户名称;
appid:应用程序ID,通过Administrator登录数据中心后,在【系统管理】分类的【第三方系统登录授权】功能里面进行新增维护;(云之家可以不填由querystring参数决定)
signeddata:参考文章【https://vip.kingdee.com/article/37406】;
timestamp:登录时间戳(Unix时间戳,定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数);
lcid(可选):语言ID,中文2052(默认),英文1033,繁体3076;
origintype: XT=云之家集成(同时要求entryrole=XT);SimPas=简单通行证集成;
entryrole:验证权限的入口角色;
formid: 登录后默认打开功能的表单id;
formtype = 单据:bill或空, 列表:list, 万能报表:wnreport, 直接sql报表:sqlreport, 系统报表:sysreport, 树形报表:treereport, 移动报表:movereport, 动态表单:dynamicform。
pkid:formid对应表单的主键;formtype为list时忽略,formtype为bill时起作用,如果为空表示新增状态;
otherargs:作为用户自定义参数传入,使用于二开;
permitcount:允许登录次数,0 允许重复登录 ,1 只允许登录一次 如果需要使用这个功能 参考:
formargs: 表单初始化自定义参数formargs,能设置boside中发布的自定义参数。仅V2版本协议支持该参数,V1版本不支持。 formargs为json格式字符串,例如人人报销首页参数:{ "KD_Html5_FormTheme_Name": "Galaxy" } 。(PT-146869 [7.6.0.202103] 2021/3/25 7.6.2122.7 )
openmode: 登陆后打开指定功能单据的模式,空白=原有主控模式,Single=单独打开指定单据(没有主控功能,仅HTML5端支持,需要配合轻量级入口地址:【http://xxx.xxx.xxx.xxx/k3cloud/html5/lightstartapp.aspx?ud=...】)(2019-03-13补丁 PT132327 [7.3.1199.6]);
具体内容和格式由二开人员确定,最终在指定表单的插件中通过GetCustomParameter(FormConst.StartAppArgs)获取,具体参考【https://vip.kingdee.com/article/37644 】
NET示例代码如下:
using Kingdee.BOS.Util;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Kingdee.BOS.BusinessEntity.Login;
namespace PassportLogin
{
class Program
{
static void Main(string[] args)
{
int lcId = 2052;
long timestamp = DateTimeFormatUtils.CurrentTimeMillis() / 1000;//时间戳
string dbId = "57b11d0f7a3b1a";//数据中心ID
string usserName = "ly";//用户名称
string appId = "SRMLightApp";//第三方系统应用Id
string appSecret = "7d9169bfbdc34e9cbd96069db5e72917";//第三方系统应用秘钥
string[] arr = new string[] { dbId, usserName, appId, appSecret, timestamp.ToString()};
Array.Sort(arr, StringComparer.Ordinal);
string sortdata = string.Join(string.Empty, arr);
string sign=Kingdee.BOS.Util.KDSHA256.Sha256Hex(sortdata);//签名 签名算法使用自己语言的sha256算法即可
SimplePassportLoginArg arg = new SimplePassportLoginArg();
arg.appid = appId;
arg.dbid = dbId;
arg.lcid = lcId.ToString();
arg.origintype = "SimPas";
arg.signeddata = sign;
arg.timestamp = timestamp.ToString();
arg.username = usserName;
arg.entryrole = string.Empty;
arg.formid = string.Empty;
arg.formtype = string.Empty;
arg.otherargs =string.Empty;
arg.pkid = string.Empty;
string argJosn = Kingdee.BOS.JSON.KDObjectConverter.SerializeObject(arg);//json格式
string argJsonBase64 = System.Text.UTF8Encoding.UTF8.GetBytes(argJosn).ToBase64();//base64编码
string silverlightUrl = "http://localhost/K3Cloud/Silverlight/IndexSL.aspx?ud=" + argJsonBase64;// Silverlight入口链接
string html5Url = "http://localhost/K3Cloud/html5/Index.aspx?ud=" + argJsonBase64;// html5入口链接
string wpfUrl="K3cloud://localhost/k3cloud/Clientbin/K3cloudclient/K3cloudclient.manifest?Lcid=2052&ExeType=WPFRUNTIME&LoginUrl=http://localhost/k3cloud/&ud="+argJsonBase64; ///客户端入口链接
Console.WriteLine(silverlightUrl);
Console.WriteLine(html5Url);
Console.ReadLine();
}
}
}
中文名的进不去只到登录界面,请配置
common.config配置 <!--默认为操作系统默认编码,例如简体服务器为GB2312编码器,如果需要制定,可以用下面参数制定utf-8-->
<add key ="StartAppPluginUDConfig" value="{encoding:'utf-8'}" />
然后 string argJsonBase64 = System.Text.UTF8Encoding.UTF8.GetBytes(argJosn).ToBase64();//base64编码
如果是21年3月以后补丁 在构建url时添加参数udencoding=utf-8也可以解决
对生成好的ud参数整体进行基于Utf-8的Base64的编码,并在url地址增加url参数 &udencoding=utf-8 即可。例如:https://xxx/k3cloud/html5/index.aspx?udencoding=utf-8&ud=### ;(PT-146869 [7.6.0.202103] 2021/3/25 7.6.2122.7 )
注意:拷贝上面的配置数据时,把所有的空格去掉然后重新空格一下,直接拷贝的空格有问题
4 从第三方系统注销用户
接口地址:http://ip/K3Cloud/Kingdee.BOS.ServiceFacade.ServicesStub.User.UserService.LogoutByOtherSystem.common.kdsvc
请求类型:post
参数
参数名称:ap0
参数值:{"AcctID":"5ab22542230aaf","AppId":"hr","Username":"txt","SignedData":"4cdde33b74d55c328291a24f299cb745a50621bc","Timestamp":1525413177}
AcctID:数据中心ID
Username:为要注销的用户名称
AppId:应用ID
SignedData:签名数据,算法同上
Timestamp:时间戳
5、知识扩展链接
V1版本集成:https://vip.kingdee.com/article/1245
V2 版本集成:https://vip.kingdee.com/article/9788
V3版本集成: https://vip.kingdee.com/article/230984230253892096
利用启动插件校验机制实现免登录功能,实现跨系统无缝集成参考如下文章: https://vip.kingdee.com/article/34918
https://vip.kingdee.com/article/8928
问题处理:
common.config配置 <!--默认为操作系统默认编码,例如简体服务器为GB2312编码器,如果需要制定,可以用下面参数制定utf-8-->
<add key ="StartAppPluginUDConfig" value="{encoding:'utf-8'}" />
然后 string argJsonBase64 = System.Text.UTF8Encoding.UTF8.GetBytes(argJosn).ToBase64();//base64编码
如果是21年3月以后补丁 在构建url时添加参数udencoding=utf-8也可以解决
对生成好的ud参数整体进行基于Utf-8的Base64的编码,并在url地址增加url参数 &udencoding=utf-8 即可。例如:https://xxx/k3cloud/html5/index.aspx?udencoding=utf-8&ud=### ;(PT-146869 [7.6.0.202103] 2021/3/25 7.6.2122.7 )
推荐阅读