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; using System.Web; namespace Kingdee.BOS.ServiceFacade.StartApp { public class MacVerify : StartAppVerifyServiceBase { /// /// 客制化参数映射到用户信息,或域签名串映射到用户信息存储池,也可以是数据库 /// static ConcurrentDictionary customArgsMapUser = new ConcurrentDictionary(); static MacVerify() { customArgsMapUser["testautologinwithdemo"] = "demo|123qwe!@#|金蝶蓝海实业集团"; } /// /// 随机测试标识,仅用于模拟各种启动校验结果的返回判定 /// static int randomFlag = 0; /// /// 实现登录服务处理接口,在程序启动界面加入参数 "ud=TestAutoLoginWithDemo" 即可实现自动用Demo用户登录CPDEMOV5数据中心 /// 例如: /// WEB的Silverlight: http://xxxx/k3cloud/silverlight/index.aspx?ud=TestAutoLoginWithDemo /// WEB的HTML5:http://xxxx/k3cloud/html5/index.aspx?ud=TestAutoLoginWithDemo /// 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; } /// /// 实现登录校验的例子的私有函数 /// private void VerifyLogin(KDServiceContext context, StartAppResult ret, JSONObject data) { //实现自动登录功能 var customArgs = data.GetValue("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; } } } /// /// 实现基类访问校验接口,如果没有该业务需求,可以不实现,使用基类的接口即可。 /// public override StartAppResult Verify(string ipmac) { randomFlag++; StartAppResult ret = null; var data = JSONObject.Parse(ipmac); var flag = randomFlag % 5; flag = 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; } /// /// 构造返回结果 /// /// 返回回调类型 /// 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 = "温馨提示" + "0022883030028663", Message = "网站正在维护中 ... ..." + "0022883030028642" + "\r\n" + attMsg }; return ret; } } }