窗体验证扩展程序

  • Jonathan Allen
  • 侯伯薇

2011 年 7 月 20 日

话题:.NETWeb框架开源DevOps语言 & 开发架构

通常我们会使用现成的大型而复杂的框架,即便能够构建属于自己的框架,可能我们也不想那么做。但是,有时只具有几个类的简单小型类库就能够让一切变得不同。FormsAuthenticationExtensions 这个项目就是典型的例子。

即便是有了像 MVC 3 那样先进的框架,对于公开的站点来说,我还是建议使用古老的表单身份验证作为安全模型。当它与成员和角色提供程序组合在一起时,配置会很容易,并且非常灵活。在最简单的模式中,表单身份验证会基于加密的 cookie 完成,其中包含了用户名或者 id。其他信息都必须使用其他方式访问。可选的方式包括:

  • 调用 Membership.GetUser,在使用默认实现的时候这种方式会查询数据库。这肯定是可行的,但是这样做有些取巧,并且它在页面生命周期中的位置使得调试变得很困难。
  • 在 Session 中会存储额外的信息,那意味着你确实需要让会话保持有效。对于小型站点这没有问题,但是一旦你需要多台 web 服务器,这就会出现问题了。

FormsAuthenticationExtensions让你有了第三种选择。它不会构建成员缓存或者设置会话服务器,你可以只是把额外的信息存储在身份验证 cookie 中。下面是一个小型 MVC 项目的例子,我用它来测试这个程序库。它替换了 AccountController.LogOn 方法中的默认代码。

  

//FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);

var ticketData = new NameValueCollection();

ticketData["Name"] = model.UserName; ticketData["Key"] = membershipUser.ProviderUserKey.ToString(); ticketData["Email"] = membershipUser.Email;

new FormsAuthentication().SetAuthCookie(model.UserName, model.RememberMe, ticketData);

项目的创建者为我们提出了一项警告:

规模很重要。

你以这种方式存储的信息会嵌入在表单 ticket 中,然后会加密并发送回用户的浏览器。在此之后的每次请求中,整个 cookie 都会发送回来并进行解密。在其中存储大量的数据显然会出现问题。我们要确保其中只存储一些简单的值。

支持 FormsAuthenticationExtensions 与上面的问题毫不相关,那就像载入 NuGet 包一样简单,只需要修改几行代码就可以。

如果你拥有其他小型但很有用的程序库,你认为人们应该了解它们,请在此评论告诉我们,或者也可以使用页面顶端的“提供新闻”链接。

查看英文原文:Forms Authentication Extensions

.NETWeb框架开源DevOps语言 & 开发架构