词条统计
浏览次数:6366 次
编辑次数:2次 历史版本
最近更新:2013/6/20
创建者:掷鸡蛋者


前面我们使用 sesseion 来存储用户的登录状态,这在小系统中,完全没有问题。
但在大型系统中,因为服务器端的 session 为每个用户都要额外分配内存,占用较多资源,所以最好还是使用 cookie 来保持状态。

另外,使用 cookie 保存状态还有一个更重要的原因:就是可以让用户选择保存状态的时间,从几分钟到几十年都可以;而session一般只能保持20分钟。

第一部分:将前面使用 session 的代码修改成使用 cookie 的:

在上面的代码中,我们注释掉了session 部分,改用 ctx.web.UserLogin 方法,这个方法内部再调用 ASP.NET 自带的 FormsAuthenticationTicket 封装授权票据(其中核心数据是user.Id),并用 FormsAuthentication 加密,最后使用 cookie 方式存储到客户端。

不知道您注意到了没有,UserLogin 方法的最后一个参数是一个 LoginTime 枚举,表示您让 cookie 在客户端保存的时间,它有如下的值:

第二部分:检查用户是否登录

我们使用了 WebContext(通过ctx.web得到) 对象的 UserIsLogin 方法来判断用户是否登录。

第三部分:用户注销

如果是使用 cookie 的方式保持状态,您需要通过调用 WebContext 对象的 UserLogout 方法来注销。
如果使用 session 保持状态,则 需要重置session相应的key来注销。

第四部分:获取cookie中的数据

前面我们在保存用户登录状态的时候,将 userId 加密存储在cookie 中。
现在,我们需要在程序中重新获取,在后台页面的右上角显示“欢迎您,某某”字样。以下是效果图:

 

在布局页面的视图中,我们这些写:

在布局controller 中,我们这样编码:

好了,到此为止,一个完整的用户管理(CRUD)、登录、注销、显示以及权限控制的功能就完成了。


补充:自定义安全验证cookie(加密的cookie)

一般处理用户登录问题,我们都使用.net默认的cookie加密验证机制,它只有一个默认的cookie名称,不能对用户进行多次 cookie 验证(比如前台登录之后,还要进行后台登录这种情况)。因为多次验证需要多个加密cookie。

对于多次登录验证的情况,最简单的解决办法是:第一个验证仍然使用默认的cookie加密验证,第二个或更多的验证使用session。但session在使用过程中往往有诸多不如意之处,比如在服务器内存紧张的情况下,经常被清空,导致用户验证过期,需要频频重复登录。

最根本的解决办法,则是:在默认的加密cookie之外,自定义一个加密的cookie。wojilu 1.7 对这个功能进行了封装,只要输入自定义的cookie名称,则自动产生加密的安全cookie,以方便多次登录验证。全套方法和默认的登录验证方法完全相同,只不过相应多了一个参数,比如原先的默认的cookie加密登录方式是 ctx.web.UserLogin()/ctx.web.UserId()/ctx.web.UserLogout(),新增加的是 ctx.web.UserLogin(cookieName)/ctx.web.UserId(cookieName)/ctx.web.UserLogout(cookieName)

代码和演示见此处: http://www.wojilu.com/Demo/Valid/Cookie.aspx