系统正常运行几个月了...
某天,客户突然发现个人信息保存失败!!
找不到原因,我直接登录了客户的账号,进行个人信息修改操作却成功了!
难道是环境问题(系统?浏览器?)
我换了同事电脑,登录了客户的账号,进行个人信息修改操作又成功了!
我远程公司服务器,登录了客户的账号,进行个人信息修改操作还是成功了!
应该不是环境问题。
我跟客户说:我这边试了没问题啊!
后来,我被领导批了。
问题在哪啊?!!
无奈,我被领导叫到客户工作地(幸好不特别远),看客户一步一步操作。
(后来想想其实可以让客户将操作步骤截图发给我,或者给客户一个录屏软件安装包录屏发给我)
果然问题重现了!
对比发现,唯一的区别是 客户登录用户名首字母是大写的!我习惯了小写。
而修改个人信息程序时,需要对个人信息中的用户名和 Identity(类似Session)的用户名进行比较,
当用户名不区分大小写时,比较的时候都应该转为小写!!
应将相同改动 (比较操作)都封装到同一个后一类方法里面,每次都调用同一个方法,避免出现问题是多出修改。--程序设计的单一原则
例如:
用户信息的查询方法,应该统一调用一个方法;
前端传递来的用户名和服务器端Identity中用户名比较,应该统一调用一个方法;
/// <summary> /// 更新当前用户信息 /// </summary> /// <param name="user"></param> /// <returns></returns> public JsonResult SetLoginUserInfo(T_User user) { var result = new ResultModel(); result.success = false; result.msg = "提交失败!"; var userManage = new BLL.UserManageBLL(); var isValidIDCard = RegexHelper.ValidIDCard(user.IDCard); if (isValidIDCard == false) { result.success = false; result.msg = "身份证号码错误!"; return Json(result); } //只能修改自己的用户信息 var userName = User.Identity.Name;//来自Identity if (userName != null && userName != "") { if (user != null && user.UserName.ToLower() == userName.ToLower())//当用户名不区分大小写时,用户名的比较都要转小写 { userManage.UpdateUser(user); result.success = true; result.msg = "提交成功!"; } } return Json(result); }
更大的失误是:
登录校验成功后,Identity存储的用户名应该是数据库里查询的用户,而不是用户传来的用户名!
var user = userManageBLL.GetUserByUserName(login.username);//查询方法中做了转小写操作
ClaimsIdentity _identity = new ClaimsIdentity(DefaultAuthenticationTypes.ApplicationCookie); _identity.AddClaim(new Claim(ClaimTypes.Name, user.UserName));//login.username 是错误的
总结:
如何复现问题:
当运行环境 都一样的时候,要仔细比较正确的和错误的操作的差别。
观察操作背后调用了哪些API,观察和调试锁定问题代码。