Profile包含很少的东西,比如用户名称、ID、头像、个人空间URL,这些最基本的。
以前用session保持登录状态时,这些东西可以全都放到Session["CurrentUser"]中。但是现在用了forms验证,从User.Identity.Name中可以取到唯一key(虽然叫name,但是我觉得大多数情况下存的还是用户的email或者用户id吧,如果用户名称唯一的话倒是也可以放),假设现在系统中把ID存到User.Identity.Name中,当然取出来的时候需要Convert一下。那么用户名称、头像、个人空间URL这些数据可以放到哪儿呢,基本上所有页面都会用到的,比如CSDN,在论坛首页“个人资料”那里就会显示这些。Session:有点不合适啊,如果用户勾选了“记住我”,auth cookies留在客户端俩月,这不还得加个判断看数据是否是失效了的,失效了再去取来放着,多个站点使用session的话还得用sqlserver或者stateserver方案什么的,有点麻烦。Cache:基本上跟session是一样了,没了再取塞进去,可以设个滑动过期什么的,。Cookies:这些信息都不是敏感信息,因为具体限定操作者身份的还是User.Identity.Name,其他只是为了方便读取而已,就算他篡改了,也只是自己的界面出问题,因为这些信息只用于显示。
还有一个想法就是,扩展forms验证本身存储的数据,比如扩展User.Identity,现在不是只有Name吗,能不能扩展成一个UserProfile对象来使用呢?
当然刚才也说了,如果数据不敏感,直接明文存也没什么,犯不着搭他的加密顺风车。不知道我的想法有没有误区。大家在项目中使用的是哪种方式呢?望指点讨论一二啊~~forms验证会话用户

解决方案 »

  1.   

    合适存到user profile中。在forms验证中,username就是唯一的(不能光通过password区分用户),如果要取得id(用SqlMembershipProvider的话):
    MembershipUser user = Membership.GetUser(this.User.Identity.Name);
    Guid id = (Guid)user.ProviderUserKey;
      

  2.   

    这是每次都去读SqlServer?。。
      

  3.   

    不需要啊,这是把username转成id,只要在forms验证成功后存到session中就可以了,id又不会变。如果要asp.net的profile机制,并不需要自己去读取id,asp.net自动实现了当前用户的无缝对接。
    可以看一下这个文章:
    http://www.codeproject.com/Articles/420052/Implementing-User-Profiles-in-ASP-NET-A-Beginners
      

  4.   

    看到那一堆生成的表已经吐了。。
    其实我的问题关键是“只要在forms验证成功后存到session中就可以了”
    这里。。想问问大家在存储会话时期的profile有什么好的方案。cnblogs好像是用的cache,csdn是把不敏感的profile存到了cookies里面,UserName和UserNick是明文的,UserInfo中不知存的什么,是加密的。
      

  5.   

    表很多吗?不就aspnet_Profile一个表吗。应该说用asp.net自带的profile是最方便的,这个差不多相当于模块级别的“控件”,拖进来就能用了。
    如果有特殊要求的话,当然也可以自己实现profile方案,但基本做法应该是和asp.net一样的,cookie中只存放用户身份标识,具体的信息应该存在数据库中,存在cache中不能持久化,而cookie最多只能存4k数据。
      

  6.   

    - - 肯定是要持久化的啊。
    我问的问题很简单,只是说一个类似于“缓存”的解决方案,到底是借助cache、session还是cookies解决。举个例子,CSDN是借助cookies解决的,那么每次我打开一个页面,需要show我的profile的时候,直接从cookie中读取显示,而不需要去读一次数据库。当登录时候才去读取数据库setCookie,或者没有找到对应数据的时候。
    放在cache和session中也是相近的,只是各有优劣。
    我想问的就是大家对这些优劣点的看法和自己的选择
      

  7.   

    asp.net profile本身也有缓存,它是每次http请求读取一次,单次request里面不会重复读取。这个设计应该说符合通常的应用场景,不过访问量很大的话,对数据库确实是会有压力的。
    可以有很多方式实现其它的缓存方式,最简单的就是把profile放到session中去,这样一次用户会话期间只会访问一次数据。可以侦听session end事件,把profile的变更写回数据库。当然也可以每次修改都写回数据库,因为用户设置通常是不经常变的。你说的没错,每种方式都有优缺点,asp.net的比较通用,但不一定适合每种情况,所以要根据你的具体业务应用场景来规划。
    就比如上面说的把profile存在session中的情况,如果在服务器集群部署时,性能就不见得提高,因为这时候不能采用in-memory cache,必须在服务器之间进行状态同步,同步的数据量大的话反而降低效率。
      

  8.   

    审视了一下现在的项目情况。。我觉得还是先用cookies了,因为数据量很小,都是可以readonly的非敏感数据,只是这个地方得讲清楚不能取了做用户凭证,也不能乱放敏感信息。
    等数据量大的话再考虑cache吧。
    谢谢你了!