加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

DWS开发档案解密:Web的验证方法与权限控制

(2007-04-01 22:28:08)
分类: Web 3.0
  基于的 Web 应用在授权认证方面,有多种安全验证方法,最早的方法是通过 Web 服务器支持的 WWW-Authenticate 标准所实现的,支持 Base64 和 MD5 等编码。一般浏览器允许3次重试的机会,验证失败时返回401错误提示,验证成功则多出一个 REMOTE_USER 环境变量。
  在 IIS 上除了支持标准的 WWW-Authenticate 还支持 WindowsNT 的 NTLM 验证方式,但这个方法在其它浏览器和其他 eb 服务器下并不兼容,通常只应用于局域网。
  WWW-Authenticate 是以目录为对象的,如将 /users 目录加上访问控制,则 /users 目录下的内容,必须通过验证的用户才能访问。
  这种方法的问题是界面不够友好,将验证放在 Web 服务器这一层会有所局限,账号权限也不在 Web 服务器这层区分,Web 服务器只做用户认证工作。通常 Web 服务器只根据本机的配置信息进行验证,在做分布式处理时显得比较吃力,虽然像 Apache 也有 MySQL 的验证模组,但都不是默认配置,并且部署起来非常困难。
  另一种则是基于 HTTPS 的安全连接,需要证书、公钥、私钥等,使用复杂,需要专门申请证书并安装等,通常只见于和银行有关的网站服务。
  比较常见的方法是采用 Cookies 或 Session 记录用户认证的登录信息,每次通过 Session 提交到服务器进行对比。该方法则只利用 Web 服务器最基本的 Cookies 支持,一般需要自己编写专门的 Session 及 Authe 程序用于账号注册、管理、登录等程序。
  上面这种方法兼容性相对来说还不错,但并不是最好的,更旧的或某些特殊的浏览器,甚至连 Cookies 都不支持,又或者是用户为了安全考虑,将 Cookies 功能禁止了,此时利用这种方法则会失效。还有一种情况Cookies解决不了,那就当跨域操作时,由于安全原因,Cookies 是无法继承过去的。
  为了解决这些问题,有一种方法可以解决,就是在 CGI 程序的 QUERY_STRING 环境变量增加 Session 值,如 abc.cgi?a=a1&b=b1&session=898e82c94d7703e96f7ea83b31e0ac2b,不过一般为了更好的兼容性,甚至将 Session 值赋给 PATH_INFO 环境变量,如 /cgi-bin/abc.cgi 是真实相对路径,登录后的 PATH_INFO 环境变量为 /cgi-bin/898e82c94d7703e96f7ea83b31e0ac2b/abc.cgi,每次通过中间的 Session 值与服务器记录的进行对比效果相同。
  权限控制方面,复杂程度将根据业务逻辑去设计,一般会有管理、普通、访客等三种角色,进一步的则用组去划分权限。
  最复杂,也是目前我最欣赏的是 Yahoo! ID 及 Microsoft Passport,他们的兼容性从一开始到扩展 N 多的业务,都能一脉相承。特别是 Yahoo! ID 收购了数十个公司,依然能做到这一点,在中国到目前为止尚没有一家公司能做到。
  Yahoo! ID 的方法不算复杂,有个中心验证服务器。各种应用服务器遇到需要验证的情况时,将应用服务器的信息附在 URI 上,先重定向到中心验证服务器,验证通过后再重定向回应用服务器。
  中心验证服务器是用 LDAP 实现的,只保留有最简单及核心的隐私资料,各种应用服务器需要的信息,在首次使用时,会进行一次初始化,补充一些个人信息和功能设置等。
  我们 DWS 的验证问题虽然没有和 Yahoo! ID 要求的那么复杂,但是他是最值得我们借鉴的对象,Web 服务器的验证为了是控制远程用户的认证,内部的认证则可以理解为 Passport 的验证,一个账号登录后,在各个子域(或应用)间跳转时,无需再次登录,继承账号登录信息,但是并不继承权限,各有各的权限管理。
  (注:本文于2005年12月27日发布在 W3G 内部开发 BLOG 中)

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有