.net MVC 用户名大小写问题导致个人信息保存失败!

系统正常运行几个月了...

某天,客户突然发现个人信息保存失败!! 

找不到原因,我直接登录了客户的账号,进行个人信息修改操作却成功了!

难道是环境问题(系统?浏览器?)

我换了同事电脑,登录了客户的账号,进行个人信息修改操作又成功了!

我远程公司服务器,登录了客户的账号,进行个人信息修改操作还是成功了!

应该不是环境问题。

我跟客户说:我这边试了没问题啊!

后来,我被领导批了。

问题在哪啊?!!

无奈,我被领导叫到客户工作地(幸好不特别远),看客户一步一步操作。

(后来想想其实可以让客户将操作步骤截图发给我,或者给客户一个录屏软件安装包录屏发给我)

果然问题重现了!

对比发现,唯一的区别是 客户登录用户名首字母是大写的!我习惯了小写。

而修改个人信息程序时,需要对个人信息中的用户名和 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,观察和调试锁定问题代码。

原文地址:https://www.cnblogs.com/hao-1234-1234/p/13851302.html