金蝶云星空二开支持动态密码校验功能
1.预期二开实现效果:
a.用户名密码登陆后;
b.弹出模态动态密码校验窗口,动态密码文本,确定,取消按钮;
c.确定校验通过,加载主控逻辑;
d.校验失败或取消,登出到登陆界面;
e.不修改原有的主控插件逻辑代码,用二开方式做,扩展主控动态表单,新增插件继承主控插件实现二次校验逻辑;(卸载原有主控插件,避免出厂主控逻辑跑两遍);
2.主插件配置
a. SILVERLIGHT/WPF端主控台ID为BOS_MainConsoleSutra,二开时需拓展该单据,并创建新插件类(以TestMainConsolePlugin.cs为例),将新插件注册到拓展的主控台单据中。新插件继承原silverlight主控插件HomePageSutra,并将原插件HomePageSutra设置为不启用。只需勾选启用新插件TestMainConsolePlugin即可。同理,HTML5端也要按照以上步骤设置主控BOS_HtmlConsoleMain。
b. 按照需求创建所需的动态密码验证表单(本文以BAS_TESTOPTAUTHORIZE为例),并为该表单创建并注册上插件(以TestOPTAuthorize.cs)。插件主要处理获取动态密码,以及验动态密码的正确性,并将校验结果返回到主控台插件中。这里调用了星空生成动态密码的逻辑,只需要用户账户绑定了手机号,点击获取验证码,即可在手机号上获取到动态密码,该动态密码有效时间为30秒。二开可以根据需求创建单据,或者根据需要自己写动态密码的生成和校验逻辑。动态单据以及单据主要逻辑如下。需要引用组件:Kingdee.BOS.Business.PlugIn,Kingdee.BOS.ServiceHelper.dll,Kingdee.BOS.BusinessEntity.dll,Kingdee.BOS.dll。
/// <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校验,自己二开去写这个校验逻辑,根据当前用户还有设置的动态密码有效期等条件去表里查数据,获取到有数据则校验成功,反之校验失败。
金蝶云星空二开支持动态密码校验功能
本文2024-09-23 03:48:33发表“云星空知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-k3cloud-161236.html