分享:利用启动插件校验机制实现免登录功能,实现跨系...

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

分享:利用启动插件校验机制实现免登录功能,实现跨系...

原始连接:https://vip.kingdee.com/article/25013 


分享:利用启动插件校验机制实现免登录功能,实现跨系统无缝集成(2015-08-20之后的补丁中)


特别敬告:本例子中采用的参数映射法,强烈推荐采用V2版本的参数协议,具有更强的扩展性。V2协议参看链接】 

V2协议参考:【启动插件校验机制实现免登录功能-支持云之家集成与JSON参数


【功能】:在2016-04的补丁中,我们增加一种简单通行证方式,可以通过注册公钥加密用户名数据中心信息实现登录。详情请参考下面帖子更新内容【启动插件校验机制实现免登录功能,【简单通行证】方式



1、背景
    在一些第三方系统中希望集成K/3 Cloud系统,在第三方系统登录后能直接进入K/3 Cloud系统,而无须再次通过登录界面录入数据中心,用户名和密码,这时基于安全性需要,需要提供客制化的会话串来实现与第三方系统之间的映射校验。

2、实现
    在K/3 Cloud客户端或者Web程序启动时,调用StartAppVerifyService服务进行校验,校验可配置用户定制逻辑组件接入进行校验。如果允许接入,则按用户定制组件逻辑实现K/3 Cloud登录校验,校验通过,则直接按指定用户进入K/3 Cloud系统主控界面。

3、客户定制逻辑组件编写详细代码参考6
     3.1、新建C#组件库工程,配置为NetFramework4.0支持。
     3.2、引用K/3 Cloud WebSite/Bin目录下的如下4个组件:
Kingdee.BOS.dll, 
Kingdee.BOS.DataEntity.dll, 
Kingdee.BOS.ServiceFacade.ServicesStub.dll,
Kingdee.BOS.ServiceFacade.KDServiceFx.dll。
     3.3、添加新类文件,命名为MacVerify(例如),并继承接口   Kingdee.BOS.ServiceFacade.ServicesStub.StartAppVerifyServiceBase抽象类,实现接口行数 StartAppResult Verify(KDServiceContext context, string ipmac)。其中ipmac数据会包含属性customArgs,该属性既是客制化参数,由第三方应用传入,传入方式如下三种方式, 组件中的customArgs参数内容来源于下面定制参数的ud入口参数内容
        /// 例如:
        /// 【映射用户登入信息方式】
        /// WEB的Silverlight: http://xxxx/k3cloud/silverlight/index.aspx?ud=TestAutoLoginWithDemo
        /// WEB的HTML5:http://xxxx/k3cloud/html5/index.aspx?ud=TestAutoLoginWithDemo 

     3.4、MacVerify中可定制客户逻辑,最终返回 StartAppReslut对象即可。如果ResultType==Success正常登录,如果ResultType==Failure,则提示Message中的文本内容。通过customArgs进行数据中心,用户匹配,再调用基类的DoLoginCore方法实现K/3 Cloud的登录校验,或获取返回值的UserToken到StartAppReslut对象中。返回不需处理该UserToken,直接返回StartAppReslut对象即可实现自动登录了。
     3.5、需要特别注意的是,不要在插件中直接throw new Exception(),要用返回方式2提示退出,或者方式4提示重定向来显示错误的内容,包括 exception.Message exception.StackTrace;   一旦插件throw异常,框架会忽略异常后进入登录界面。

     3.6、更多其他信息参考下面文章
参考如下文章3: https://vip.kingdee.com/article/34918


参考如下文章2:  https://vip.kingdee.com/article/37406
参考如下文章1: https://vip.kingdee.com/article/25013

自动登录后,实现自动打开某个单据的功能 : https://vip.kingdee.com/article/37644


第三方系统比如Cas的集成案例,参考:

https://vip.kingdee.com/article/37406 


4、部署
    4.1、拷贝插件到WebSite/Bin目录下。
    4.2、修改配置文件WebSite/App_Data/Common.config,在appsettings节点下增加如下项目:
<!--启动服务插件-->
<add key ="StartAppPlugin"  

 value="Kingdee.BOS.ServiceFacade.StartApp.MacVerify,Kingdee.BOS.ServiceFacade.StartApp" />


特别注意:不要只写类名,组件名就不写了。上面value的格式是【类的全名,组件名
               Kingdee.BOS.ServiceFacade.StartApp这个组件和其中的类仅是功能测试和演示使用。二次开发的插件不要使用Kingdee, Kingdee.BOS,Kingdee.BOS.ServiceFacade, Kingdee.BOS.ServiceFacade.StartApp.MacVerify这些命名空间和类名。如果想直接使用这个演示组件内容,建议拷贝文章中的代码内容后,修改命名空间和类名为贵公司的命名规则,不用使用Kingdee命名空间,避免后续功能补丁升级时的覆盖影响。  


5、第三方接入方式
  实现插件启动登录逻辑(参考后面6的插件实现)后,即可用下面方式实现免登录直接进入K/3 Cloud系统主控。
  实现登录服务处理接口,在程序启动界面加入参数ud=TestAutoLoginWithDemo即可实现自动用Demo用户登录CPDEMOV5数据中心
  例如:
    WEB的Silverlight: http://xxxx/k3cloud/silverlight/index.aspx?[url=]ud=TestAutoLoginWithDemo[/url]
    WEB的HTML5:http://xxxx/k3cloud/html5/index.aspx?ud=TestAutoLoginWithDemo

6、第三方接入插件代码编写:

按【3、客户定制逻辑组件编写】完成插件工程配置后修改启动插件,继承基类StartAppVerifyServiceBase,并实现StartAppResult Verify(KDServiceContext context, string ipmac)接口;

【例子代码全文如下:】
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections.Concurrent;
using Kingdee.BOS.Authentication;
using Kingdee.BOS.JSON;
using Kingdee.BOS.ServiceFacade.KDServiceFx;
using Kingdee.BOS.ServiceFacade.ServicesStub;
using Kingdee.BOS.Resource;
namespace Kingdee.BOS.ServiceFacade.StartApp
{
    public class MacVerify : StartAppVerifyServiceBase
    {
        /// <summary>
        /// 客制化参数映射到用户信息,或域签名串映射到用户信息存储池,也可以是数据库
        /// </summary>
        static ConcurrentDictionary<string, string> customArgsMapUser = new ConcurrentDictionary<string, string>();
        static MacVerify()
        {
            customArgsMapUser["testautologinwithdemo"] = "demo|888888|CPDEMOV5";
        }
       /// <summary>
        /// 随机测试标识,仅用于模拟各种启动校验结果的返回判定
        /// </summary>
        static int randomFlag = 0;
        /// <summary>
        /// 实现登录服务处理接口,在程序启动界面加入参数 "ud=TestAutoLoginWithDemo" 即可实现自动用Demo用户登录CPDEMOV5数据中心
        /// 例如:
        /// WEB的Silverlight: http://xxxx/k3cloud/silverlight/index.aspx?ud=TestAutoLoginWithDemo
        /// WEB的HTML5:http://xxxx/k3cloud/html5/index.aspx?ud=TestAutoLoginWithDemo
        /// </summary>
       public override StartAppResult Verify(KDServiceContext context, string ipmac)
        {
            var ret = this.Verify(ipmac);
            if (ret.ResultType == StartAppResultType.Success)
            {
                var data = JSONObject.Parse(ipmac);
                VerifyLogin(context, ret, data);
            }
            return ret;
        }
       /// <summary>
        /// 实现登录校验的例子的私有函数
        /// </summary>
        private void VerifyLogin(KDServiceContext context, StartAppResult ret, JSONObject data)
        {
            //实现自动登录功能
            var customArgs = data.GetValue<string>("customArgs", "");//ud用户定义参数将会传递到服务端插件的customArgs中
            var isAutoLogin = !string.IsNullOrWhiteSpace(customArgs);
            if (isAutoLogin && context != null)
            {
                try
                {
                    //不一定非得从data中传进来这些信息,
                    //也可以通过Mac映射到数据库中的某个记录,从中读取登录信息,
                    //包括用户名、密码和数据库id,已经对应的语种id
                    //这里只是Demo而已
                    var userInfoStr = "";
                    var key = customArgs.ToLowerInvariant();
                    customArgsMapUser.TryGetValue(key, out userInfoStr);
                    if (string.IsNullOrWhiteSpace(userInfoStr))
                        userInfoStr = "";
                    var userInfo = userInfoStr.Split('|');
                    var un = userInfo.Length > 2 ? userInfo[0] : "";
                    var pw = userInfo.Length > 2 ? userInfo[1] : "";
                    var dbname = userInfo.Length > 2 ? userInfo[2] : "";
                    var pluginLoginInfo = new PluginLoginInfo()
                    {
                        //AcctID = "xxxxxx", //AcctID如果传递,将不再通过AcctName查找AcctID了。
                        //LoginType = PluginLoginType.Common, //默认为用户名密码的通用登录方式。                        //PluginLoginInfo.AuthenticateType = Kingdee.BOS.Authentication.AuthenticationType.DynamicPwdAuthentication, // 动态密码验证方式
                        AcctName = dbname,
                        Username = un,
                        Password = pw,
                        ClientInfo = GetClientInfo(context, data) //基类静态工具方法
                    };
                    //调用基类静态工具方法实现登录验证,并返回ret.UserToken,给客户端实现自动登录
                    DoLoginCore(context, ret, pluginLoginInfo);
//登录后的参数传入,具体使用参考【自动打开单据
                    if (!string.IsNullOrWhiteSpace(ret.SessionId))
                    {
                        var isoKey = ret.SessionId + "_AutoLoginArgs";
                        //登陆成功后,加入自定义参数
                        HttpContext.Current.Application.Set(isoKey, "PUR_PurchaseOrder|100001");
                    }
                }
                catch (Exception ex)
                {
                    ret.ResultType = StartAppResultType.Failure;
                    ret.FailureCallBackType = StartAppResultCallBackType.Message;
                    ret.Message = ex.Message + "\r\n" + ex.StackTrace;
                }
            }
        }
        
       /// <summary>
        /// 实现基类访问校验接口,如果没有该业务需求,可以不实现,使用基类的接口即可。
        /// </summary>
        public override StartAppResult Verify(string ipmac)
        {
            randomFlag++;
            StartAppResult ret = null;
            var data = JSONObject.Parse(ipmac);
            var flag = randomFlag % 5;
            switch (flag)
            {
                case 4:
                    // 提示后退出并重定向到指定页面
                    ret = GetResult(StartAppResultCallBackType.ExitMsg_Redirect, ipmac);
                    break;
                case 3:
                    // 退出并重定向到指定页面(不做任何提示)
                    ret = GetResult(StartAppResultCallBackType.Exit_Redirect, ipmac);
                    break;
                case 2:
                    // 退出并提示
                    ret = GetResult(StartAppResultCallBackType.ExitMsg, ipmac);
                    break;
                case 1:
                    // 提示信息(不退出程序)
                    ret = GetResult(StartAppResultCallBackType.Message, ipmac);
                    break;
                default:
                    ret = new StartAppResult()
                    {
                        ResultType = StartAppResultType.Success
                    };
                    randomFlag = 0;
                    break;
            }
            return ret;
        }
         /// <summary>
        /// 构造返回结果
        /// </summary>
        /// <param name="fcbType">返回回调类型</param>
        /// <returns></returns>
        private static StartAppResult GetResult(StartAppResultCallBackType fcbType, string attMsg)
        {
            var ret = new StartAppResult()
           {
               FailureCallBackType = fcbType,
               // 成功Sucess:正常登录
               ResultType = StartAppResultType.Failure, 

               // 外部网址:RedirectUrl = "http://www.kingdee.com
               // 空白页:RedirectUrl = "about:blank"
               // 失败后重定向URL,可以是相对路径也可以是绝对路径,相对路径已K3Cloud为基地址,例如:http://xxxx/k3cloud/
               RedirectUrl = "help/clienthelp.htm",
               ExitType = StartAppResultExitType.Shutdown,

               Title = ResManager.LoadKDString("温馨提示", "0022883030028663", SubSystemType.BOS),
               Message = ResManager.LoadKDString("网站正在维护中 ... ...", "0022883030028642", SubSystemType.BOS) +
               "\r\n" + attMsg
           };
            return ret;
        }
    }
}


--附录---------------- 参考帖子区 ----------------------

星空第三方免登资料参考链接

https://vip.kingdee.com/article/221201966503051264 


----------------------------

编辑于2020年4月8日 10:48:28

分享:利用启动插件校验机制实现免登录功能,实现跨系...

原始连接:https://vip.kingdee.com/article/25013 分享:利用启动插件校验机制实现免登录功能,实现跨系统无缝集成(2015-08-20之后的补丁...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息