zoukankan      html  css  js  c++  java
  • .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,观察和调试锁定问题代码。

  • 相关阅读:
    docker 部署aps.net MVC到windows容器
    docker 搭建私有仓库 harbor
    解决关于:Oracle数据库 插入数据中文乱码 显示问号???
    ionic cordova build android error: commamd failed with exit code eacces
    cordova build android Command failed with exit code EACCES
    Xcode 10 iOS12 "A valid provisioning profile for this executable was not found
    使用remix发布部署 发币 智能合约
    区块链: 编译发布智能合约
    mac 下常用命令备忘录
    JQuery fullCalendar 时间差 排序获取距当前最近的时间。
  • 原文地址:https://www.cnblogs.com/hao-1234-1234/p/13851302.html
Copyright © 2011-2022 走看看