通常我们会使用现成的大型而复杂的框架,即便能够构建属于自己的框架,可能我们也不想那么做。但是,有时只具有几个类的简单小型类库就能够让一切变得不同。FormsAuthenticationExtensions 这个项目就是典型的例子。
即便是有了像 MVC 3 那样先进的框架,对于公开的站点来说,我还是建议使用古老的表单身份验证作为安全模型。当它与成员和角色提供程序组合在一起时,配置会很容易,并且非常灵活。在最简单的模式中,表单身份验证会基于加密的 cookie 完成,其中包含了用户名或者 id。其他信息都必须使用其他方式访问。可选的方式包括:
- 调用 Membership.GetUser,在使用默认实现的时候这种方式会查询数据库。这肯定是可行的,但是这样做有些取巧,并且它在页面生命周期中的位置使得调试变得很困难。
- 在 Session 中会存储额外的信息,那意味着你确实需要让会话保持有效。对于小型站点这没有问题,但是一旦你需要多台 web 服务器,这就会出现问题了。
FormsAuthenticationExtensions 让你有了第三种选择。它不会构建成员缓存或者设置会话服务器,你可以只是把额外的信息存储在身份验证 cookie 中。下面是一个小型 MVC 项目的例子,我用它来测试这个程序库。它替换了 AccountController.LogOn 方法中的默认代码。
<p>//FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);</p> <p>var ticketData = new NameValueCollection(); <br></br>ticketData["Name"] = model.UserName; ticketData["Key"] = membershipUser.ProviderUserKey.ToString(); ticketData["Email"] = membershipUser.Email;</p>new FormsAuthentication().SetAuthCookie(model.UserName, model.RememberMe, ticketData);
项目的创建者为我们提出了一项警告:
规模很重要。
你以这种方式存储的信息会嵌入在表单 ticket 中,然后会加密并发送回用户的浏览器。在此之后的每次请求中,整个 cookie 都会发送回来并进行解密。在其中存储大量的数据显然会出现问题。我们要确保其中只存储一些简单的值。
支持 FormsAuthenticationExtensions 与上面的问题毫不相关,那就像载入 NuGet 包一样简单,只需要修改几行代码就可以。
如果你拥有其他小型但很有用的程序库,你认为人们应该了解它们,请在此评论告诉我们,或者也可以使用页面顶端的“提供新闻”链接。
查看英文原文: Forms Authentication Extensions
评论