金蝶云星空二开支持动态密码校验功能

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

金蝶云星空二开支持动态密码校验功能


1.预期二开实现效果:


a.用户名密码登陆后;

b.弹出模态动态密码校验窗口,动态密码文本,确定,取消按钮;

c.确定校验通过,加载主控逻辑;

d.校验失败或取消,登出到登陆界面;

e.不修改原有的主控插件逻辑代码,用二开方式做,扩展主控动态表单,新增插件继承主控插件实现二次校验逻辑;(卸载原有主控插件,避免出厂主控逻辑跑两遍);


2.插件配置



a.    SILVERLIGHT/WPF端主控台ID为BOS_MainConsoleSutra,二开时需拓展该单据,并创建新插件类(以TestMainConsolePlugin.cs为例),将新插件注册到拓展的主控台单据中。新插件继承原silverlight主控插件HomePageSutra,并将原插件HomePageSutra设置为不启用。只需勾选启用新插件TestMainConsolePlugin即可。同理,HTML5端也要按照以上步骤设置主控BOS_HtmlConsoleMain。

cchajianpng.webp

b.     按照需求创建所需的动态密码验证表单(本文以BAS_TESTOPTAUTHORIZE为例),并为该表单创建并注册上插件(以TestOPTAuthorize.cs)。插件主要处理获取动态密码,以及验动态密码的正确性,并将校验结果返回到主控台插件中。这里调用了星空生成动态密码的逻辑,只需要用户账户绑定了手机号,点击获取验证码,即可在手机号上获取到动态密码,该动态密码有效时间为30秒。二开可以根据需求创建单据,或者根据需要自己写动态密码的生成和校验逻辑。动态单据以及单据主要逻辑如下。需要引用组件:Kingdee.BOS.Business.PlugIn,Kingdee.BOS.ServiceHelper.dll,Kingdee.BOS.BusinessEntity.dll,Kingdee.BOS.dll。

ddtmm.webp

 /// <summary>

        /// 按钮点击事件

        /// </summary>

        /// <param name="e"></param>

        public override void ButtonClick(Core.DynamicForm.PlugIn.Args.ButtonClickEventArgs e)

        {

            if (e.Key.EqualsIgnoreCase("FBtnConfirm"))//确认,校验动态密码的正确性

            {

                bool checkResult = false;

                string str = this.Model.GetValue("FText").ToString();

 

                //动态密码的校验逻辑,这里用的星空的动态密码校验逻辑,该动态密码有效期为15秒

            //二开可以根据需要自己写动态密码的生成和校验逻辑

                if (!string.IsNullOrWhiteSpace(str))

                {

                    string message = string.Empty;

                    var issuccess = LightAppServiceHelper.CheckNewSecretKey(this.Context, this.Context.UserName, this.Context.UserId.ToString(), str, out message);

                    if (issuccess == true)

                    {

                        checkResult = true;

                        this.View.ReturnToParentWindow(new Core.DynamicForm.FormResult(checkResult));

                        this.View.Close();

                    }

                    else//校验失败,报错误提示,点击确定再关闭当前窗体

                    {

                        checkResult = false;

this.View.ShowWarnningMessage("动态密码验证失败,即将退回登录页。失败原因:" + message, "", MessageBoxOptions.YesNo,

                                  r =>

                                  {

                                      if (r == MessageBoxResult.Yes)

                                      {

                                          this.View.ReturnToParentWindow(new Core.DynamicForm.FormResult(checkResult));

                                          this.View.Close();

                                      }

                                  });

                    }

                }

                else

                {

                    this.View.ShowMessage("请输入验证码!");

                }

            }

            else if (e.Key.EqualsIgnoreCase("FBtnCancle"))

            {

                PassportHelper.UserAuthTokenRemove(this.View);

                this.View.AddAction("logoff", "index.aspx");

            }

            else if (e.Key.EqualsIgnoreCase("FBtnSendmsg"))//获取动态密码

            {

                ResultInfo result = new ResultInfo(string.Empty, false);

                CloudSMSInfo smsInfo = new CloudSMSInfo();

                result = LightAppServiceHelper.GetDynamicPassword(this.Context, this.Context.UserName, this.Context.UserId);

                if (result.Successful)

                {

                    smsInfo.SMSMessage = string.Format("动态验证码为:{0}", result.Message);

                    List<PhoneInfo> phoneinfolist = new List<PhoneInfo>();

                    PhoneInfo phoneinfo = new PhoneInfo();

                    phoneinfo.Phone = this.Context.UserPhone;

                    phoneinfo.ReceiverUser = this.Context.UserId;

                    phoneinfolist.Add(phoneinfo);

                    smsInfo.PhoneInfos = phoneinfolist;

                    result = SMSServiceHelper.SendMessage(this.Context, smsInfo);

                    if (result.Successful)

                    {

                        this.View.ShowMessage("验证码发送成功!");

                    }

                    else

                    {

                        this.View.ShowErrMessage("短信发送失败,失败原因:" + result.Message);

                    }

                }

                else

                {

                    this.View.ShowErrMessage(result.Message);

                }

            }

 

            base.ButtonClick(e);

        }

c.     主控台插件TestMainConsolePlugin.cs逻辑。

/// <summary>
/// 绑定数据及控件状态
/// </summary>
/// <param name="e"></param>
public override void AfterBindData(EventArgs e)
{
if (this.View.Context.UserAuthenticationMethod == Authentication.AuthenticationType.PwdAuthentication)//用户名密码登陆方式才弹出动态密码验证
{
DynamicFormShowParameter para = new DynamicFormShowParameter()
{
FormId = "BAS_TESTOPTAUTHORIZE",
PageId = System.Guid.NewGuid().ToString(),
ParentPageId = this.View.PageId,
};
para.HiddenCloseButton = true;
para.OpenStyle.ShowType = ShowType.Modal;
this.View.ShowForm(para, new Action<FormResult>((res) =>
{
if (res.ReturnData == null || !(res.ReturnData is Boolean))
{
return;
}

//操作框返回结果
bool retrunData = (bool)res.ReturnData;
if (!retrunData)//如果动态密码弹框返回false,则登出系统
{
LogOff();
}
else//返回true,加载主控逻辑
{
base.AfterBindData(e);
}
}));
}
else//其他登录方式直接加载原主控逻辑
{
base.AfterBindData(e);
}
}

/// <summary>
/// 登出
/// </summary>
protected override void LogOff()
{
base.LogOff();
}


2019-08-07补充:由于有反馈用LightAppServiceHelper.CheckNewSecretKey去校验这个验证码时效时间太短,可以考虑自己二开去做这个校验逻辑。二开的时候可以在获取动态密码(buttonclick事件中FBtnSendmsg的逻辑)中用将获取的result.Message(动态密码值)、UserPhone、UserId、生成时间等插入到一个新建的表中。另外可以设置下一个动态密码有效期在插件中。然后在校验动态密码正确性的时候去掉LightAppServiceHelper.CheckNewSecretKey校验,自己二开去写这个校验逻辑,根据当前用户还有设置的动态密码有效期等条件去表里查数据,获取到有数据则校验成功,反之校验失败。

金蝶云星空二开支持动态密码校验功能

1.预期二开实现效果:a.用户名密码登陆后;b.弹出模态动态密码校验窗口,动态密码文本,确定,取消按钮;c.确定校验通过,加载主控逻辑;d....
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息