Who Am I??
目录 |
简介 |
数据库 |
起步 |
Who Am I?? |
我可以“当”你吗? |
仅此而已吗? |
现在我们要讨论如何正确的处理请求。首先,我们要检查当前用户是谁,以及他是否拥有请求的文件权限。如果文件是开放的,自然很简单,任何人(包括匿名用户)都可以下载该文件。但是如果访问的文件是受限的,我们如何确定是谁登录的呢?
第一个方案,使用ASP的Session对象存储UserID。ASP代码可以随时了解到用户的身份,但是ISAPI在IIS的结构上和ASP位于不同的层面,所以无法访问到Session的数据。
第二个方案是通过URL传递UserID。该方案也不可行,一个怀有恶意用户是不能将UserID写入ASP Session对象中,所以对于ASP代码来说相对安全些,它可以将所有的UserID都认为是有效的。但是任何用户都可能无意的使用URL传递随机的UserID到ISAPI扩展中。总会有人发现一个可以使他取得对他来说原本不能下载的文件。
最终我们选择了使用Cooike暂存UserID和密码。该方法简单也相当有效。
将下面的代码放到上面的书简处理程序中。
UserID := StrToInt(Request.CookieFields.Values['UserID']); Password := Request.CookieFields.Values['Password']; DownloadID := StrToInt(Request.QueryFields.Values['id']); if (UserID > 0) and (Password <> '') then begin { ToDo: we have a user authorization data, check his data } end else begin { ToDo: we have an anonymous user, may download only public files } end; |
首先我们检查提供的用户信息是否有效。只需查询用户的纪录并核对密码。
qry_User.Parameters.ParamByName('UserID').Value := UserID; qry_User.Open(); try // do we have exactly one record, and does the password match? // if yes we had valid credentials. if (qry_User.RecordCount = 1) and (qry_User.FieldByName('Password').Value = Password) then begin { ToDo: user is ok, now check if he may download this file } end else Error(Response,ERROR_INVALID_USER); finally qry_User.Close(); end; |
如果密码无误,我们就确认用户合法,并转到下载的步骤。如果密码有误,我们产生一个错误。稍后我们将讨论如何将错误返回用户。