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验证会话用户
以前用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验证会话用户
解决方案 »
- GridView自动绑定的列怎样在后台编程访问,就是设置了GridView AutoGenerateColumns="true"
- .net不是区分大小写吗?为什么GAC中的公钥标识是小写而web.config中的公钥标识是大写???
- 求一正则表达式
- 考务系统的问题?
- 选用何种AJAX的框架
- IList<DutyInfo> DutyDate = new List<DutyInfo>();这种类型的值要怎么用啊
- ASP.NET的一个小问题
- 关于Remedy AR System 技术的问题
- 帮帮忙,在放假前解决这个问题!!!
- 请大家帮一个忙,急!~
- $.ajax 点击左边超链显示在右边
- asp.net c# 查询数据库 按钮导出Excel 放在桌面上 代码是怎样的
MembershipUser user = Membership.GetUser(this.User.Identity.Name);
Guid id = (Guid)user.ProviderUserKey;
可以看一下这个文章:
http://www.codeproject.com/Articles/420052/Implementing-User-Profiles-in-ASP-NET-A-Beginners
其实我的问题关键是“只要在forms验证成功后存到session中就可以了”
这里。。想问问大家在存储会话时期的profile有什么好的方案。cnblogs好像是用的cache,csdn是把不敏感的profile存到了cookies里面,UserName和UserNick是明文的,UserInfo中不知存的什么,是加密的。
如果有特殊要求的话,当然也可以自己实现profile方案,但基本做法应该是和asp.net一样的,cookie中只存放用户身份标识,具体的信息应该存在数据库中,存在cache中不能持久化,而cookie最多只能存4k数据。
我问的问题很简单,只是说一个类似于“缓存”的解决方案,到底是借助cache、session还是cookies解决。举个例子,CSDN是借助cookies解决的,那么每次我打开一个页面,需要show我的profile的时候,直接从cookie中读取显示,而不需要去读一次数据库。当登录时候才去读取数据库setCookie,或者没有找到对应数据的时候。
放在cache和session中也是相近的,只是各有优劣。
我想问的就是大家对这些优劣点的看法和自己的选择
可以有很多方式实现其它的缓存方式,最简单的就是把profile放到session中去,这样一次用户会话期间只会访问一次数据。可以侦听session end事件,把profile的变更写回数据库。当然也可以每次修改都写回数据库,因为用户设置通常是不经常变的。你说的没错,每种方式都有优缺点,asp.net的比较通用,但不一定适合每种情况,所以要根据你的具体业务应用场景来规划。
就比如上面说的把profile存在session中的情况,如果在服务器集群部署时,性能就不见得提高,因为这时候不能采用in-memory cache,必须在服务器之间进行状态同步,同步的数据量大的话反而降低效率。
等数据量大的话再考虑cache吧。
谢谢你了!