• .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,观察和调试锁定问题代码。

  • 相关阅读:
    CF1037H
    CF1296F
    CF1446F
    CF1175G
    CF1146G
    CF1303G
    CF1067D
    CF1477E
    COJ16G
    ZJOI2018 迷宫
  • 原文地址:https://www.cnblogs.com/hao-1234-1234/p/13851302.html
Copyright © 2020-2023  润新知