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;
|
如果密码无误,我们就确认用户合法,并转到下载的步骤。如果密码有误,我们产生一个错误。稍后我们将讨论如何将错误返回用户。