在写完0804版后,颓废了一段时间,并且主要在研究webmessenger(服务器暂无法访问),无暇顾及后续的asp.net forums本地化工作。经过一段时间休整,重新继续坚持对asp.net forums的本地化工作和相关文章的撰写。增加新功能,如改进中文搜索、精华帖、中文昵称,以及一些细节的完善,还有把将前段时间的研究成果webmessenger作为一个plus集成到asp.net forums中。
 
在我推出0804版后不久就有人反映修改密码后无法登录,很抱歉一直没有看这个bug,今天仔细检查了一下代码,很快就找到了原因所在:

asp.net forums的密码加密是通过salt和真实密码混合加密得出的(salt称为盐,是一串随机字符串,每个用户的salt值是不一样的,这样不同用户即使密码相同,加密出来的密码也是不一样的),所以每次用户登录前,必须先获取他的salt值,以用来和他输入的密码混合加密,将加密后的字符串和数据库中存储的密码相比较来验证密码是否正确。

为了避免过于频繁的操作数据库,asp.net forums中大量的使用了缓存技术,其中有一个Cache就是专门用来存储用户信息的,所有查询过的用户信息,都存储在该Cache中的HashTable中,如果Cache的HashTable中不存在所要获取的用户信息,则从数据库中读取该用户信息,并Cache之,否则直接从Cache中获取,无需再读一次数据库。

在修改密码时,会创建一个新的salt值,和新密码重新加密生成新的salt和密码存储到数据库中。对于asp.net forums2.0 Gold ,当用户重新登录时,验证所使用的salt值还是从缓存中读取的就的salt值,这样自然会导致验证出错!所以解决方法就是每次修改密码/资料的同时,将Cache中的资料同时更新,或者将用户资料直接从Cach中清除!

在这里,我所用的解决方法就是在成功修改密码后清除Cache,部分代码如下:

        /**//// <summary>
        /// 清除缓存中指定用户的信息
        /// </summary>
        /// <param name="user"></param>
        public static void ClearUserCache(User user)
        {
            ForumContext forumContext = ForumContext.Current;
            string cacheKey = "UserLookupTable";
            if (HttpRuntime.Cache[cacheKey] == null)
                return;

            // 所有缓存的用户都存储在缓存的一个HashTable中
            Hashtable userLookupTable = (Hashtable) HttpRuntime.Cache[cacheKey]; 
            
            string userKey;

            // 移除指定用户的缓存
            userKey = "User-" + user.UserID;
            if (forumContext.Context.Items[userKey] != null)
                forumContext.Context.Items.Remove(userKey);
            if (userLookupTable.ContainsKey(userKey))
                userLookupTable.Remove(userKey);

            userKey = "User-" + user.Username;
            if (forumContext.Context.Items[userKey] != null)
                forumContext.Context.Items.Remove(userKey);
            if (userLookupTable.ContainsKey(userKey))
                userLookupTable.Remove(userKey);

        }

asp.net Forums2.0修改密码后无法登陆问题——都是Cache惹的祸相关推荐

  1. 新建mysql 1251,mysql修改密码后无法登陆问题,发生#1251错误

    mysql修改密码后无法登陆问题,发生#1251错误 安装好mysql后修改密码发生:#1251 - Client does not support authentication protocol r ...

  2. 没有修改出现mysql密码错误_MySql 修改密码后的错误快速解决方法

    设置好密码后,使用数据库时出现如下错误: ERROR 1820 (HY000): You must reset your password using ALTER USER statement bef ...

  3. 解决mysql不能修改密码_如何解决mysql修改密码后不能成功登录_数据库_mysql修改密码_课课家...

    今天给大家解决下MySQL修改密码后导致不能登录的问题,一般我们都知道mysql4.1.1版本后修改了用户密码的格式,一旦修改了密码,4.1.1以前的版本上是不能进行成功登录的,那么对于这些问题该如何 ...

  4. mysql中修改密码无效_mysql8.0修改密码无效的问题

    今天安装了mysql8,但是在修改默认密码的时候发现一直无法成功,下面给出解决的办法. 一直报ERROR 1064 (42000): You have an error in your SQL syn ...

  5. mysql修改密码后phpmyadmin 出现#1045

    mysql修改密码后phpmyadmin 出现#1045 - Access denied for user 'root'@'localhost' (using password: NO) 我用的是wa ...

  6. mysql 8.0用doc修改密码_MYSQL8.0修改密码流程

    MYSQL8.0修改密码流程1.以管理员身份打开cmd2.找到mysql 的安装路径bin文件的路径,3.输入net start mysql4.输入mysql -u root -p5.找到my.ini ...

  7. Git本地缓存问题 修改密码后git无法拉取

    Git本地缓存问题 修改密码后git无法拉取 问题描述:使用正确的用户名和密码可以登录到Git代码仓库,但是在本地无法使用Git bash命令行的方式拉取代码. 问题原因:第一次使用Git bash方 ...

  8. 服务器怎么修改密码_亚马逊账号登陆不上,修改密码后遭冻结怎么办?有没有什么申诉的办法?...

    有微信上的小伙伴chen非常焦急的向我求助因为账号被封,全部家当基本都在账号里边,并且向我说明了基本情况. 情况是这样的,账号被冻结前两天她公司停电,所以她用VPS远程登录了账号,然后亚马逊就锁定了她 ...

  9. win10 mysql8.0修改密码

    mysql8.0修改密码和mysql5.*不一样! 1. win+r,运行cmd 2. 停掉mysql服务 net stop mysql 3.mysqld启动免登录密码模式 mysqld --cons ...

最新文章

  1. python定义类()中写object和不写的区别
  2. NanoPi NEO Air使用四:操作GPIO
  3. 「 每日一练,快乐水题 」599. 两个列表的最小索引总和
  4. 操纵自如--页面内的配合与通信
  5. 后端:50 个 经典 Spring 面试题,值得收藏!
  6. 通过OAuth 2.0和Okta构建具有安全的服务器到服务器通信的Spring Boot应用
  7. AngularJs angular.equals
  8. Vrep脚本的执行顺序
  9. 安装ssr_网易《代号SSR》电脑版教程!
  10. 为什么MediaPlayer中onCompletion()每次播放音频时都触发?
  11. Android-清空栈内的activity
  12. 国开大学计算机应用实操题作业如何上传,国开电大18秋《计算机应用基础》形考任务作业.doc...
  13. C语言图书管理信息系统
  14. java dos攻击_一种高级的DoS攻击-Hash碰撞攻击
  15. 盈利能力分析之-毛利率、销售净利率、投资回报率、权益回报率、资产回报率...
  16. 占星术杀人魔法 - 笔记
  17. 使用Excel中PPMT函数和IPMT函数进行等额本息还款的计算方法
  18. 如何培养对编程开发的兴趣
  19. Python使用asyncio+aiohttp异步爬取猫眼电影专业版
  20. 网站被挂码处理,百度等搜索引擎点击跳转其它赌博黄色等网站

热门文章

  1. 小米商城html_北京市发放新一批 170 万个消费券:京东、小米商城等平台可领
  2. 自定义sql_基于Calcite自定义SQL解析器
  3. arm-linux-gcc 裸机程序,Linux下ARM裸机开发-交叉工具链
  4. 20190823:(leetcode习题)实现 strStr()
  5. VB UTF-8 URL编码函数
  6. 【引用】在VB6.0中实现弹出式菜单的几种方法
  7. 从零学ELK系列(七):Centos安装Filebeat(超详细图文教程)
  8. SpringBoot实战(五):配置健康检查与监控
  9. tomcat集群共享session
  10. 用AI帮你画新年贺卡:只需输入几个单词,就能模仿大师名作