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

在写完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,部分代码如下:

ExpandedBlockStart.gif ContractedBlock.gif          /**/ /// <summary>
InBlock.gif        
/// 清除缓存中指定用户的信息
InBlock.gif        
/// </summary>
ExpandedBlockEnd.gif        
/// <param name="user"></param>

None.gif          public   static   void  ClearUserCache(User user)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            ForumContext forumContext 
= ForumContext.Current;
InBlock.gif            
string cacheKey = "UserLookupTable";
InBlock.gif            
if (HttpRuntime.Cache[cacheKey] == null)
InBlock.gif                
return;
InBlock.gif
InBlock.gif            
// 所有缓存的用户都存储在缓存的一个HashTable中
InBlock.gif
            Hashtable userLookupTable = (Hashtable) HttpRuntime.Cache[cacheKey]; 
InBlock.gif            
InBlock.gif            
string userKey;
InBlock.gif
InBlock.gif            
// 移除指定用户的缓存
InBlock.gif
            userKey = "User-" + user.UserID;
InBlock.gif            
if (forumContext.Context.Items[userKey] != null)
InBlock.gif                forumContext.Context.Items.Remove(userKey);
InBlock.gif            
if (userLookupTable.ContainsKey(userKey))
InBlock.gif                userLookupTable.Remove(userKey);
InBlock.gif
InBlock.gif            userKey 
= "User-" + user.Username;
InBlock.gif            
if (forumContext.Context.Items[userKey] != null)
InBlock.gif                forumContext.Context.Items.Remove(userKey);
InBlock.gif            
if (userLookupTable.ContainsKey(userKey))
InBlock.gif                userLookupTable.Remove(userKey);
InBlock.gif
ExpandedBlockEnd.gif        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值