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

  基于的 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
中)

About Lin

I was born in Shenzhen, I had studied in Lufeng and now, I am working in Beijing.
This entry was posted in Web 3.0. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>