后台判断登录,说白了就是别让没登录的人直接敲地址进管理页。ASP里最常用的是Session。登录页验证账号密码通过后,写Session("admin_id")=rs("id"),Session("admin_name")=rs("name"),Session("admin_role")=rs("role")。然后每个后台页顶部include一个check.asp。check.asp要在输出任何HTML之前执行:If Trim(Session("admin_id")&"")="" Then Response.Redirect "/login.asp?backurl="&Server.URLEncode(Request.ServerVariables("URL")) Response.End End If。注意Redirect后要Response.End,不然代码继续跑,可能把后台内容吐出去。有人只Redirect不End,在IIS7/8上偶尔还能看到页面尾巴,这是真事。
Session默认20分钟过期,IIS里可以改,但别设太长。后台操作到一半掉登录很常见,判断时给个友好跳转,登录后回原页。回跳地址要URLEncode,登录页接收后只允许站内相对路径,别直接跳Request.QueryString("backurl"),防止开放重定向。可以判断Left(backurl,1)="/"且InStr(backurl,"//")=0才用。
只判断Session("admin_id")不够,还要判断用户是否被禁用、是否被删除。每次后台请求查一次数据库太重,可以在登录时把状态写Session,禁用后让Session自然过期,或者后台关键操作再查库。真实项目里,管理员被停用但Session还在的情况不少,所以删除或禁用用户时顺手清掉他的Session不现实,经典ASP没有集中Session管理,通常靠短超时和关键操作二次校验。
自动登录用Cookie。不要Cookie里直接写admin_id=1,那等于送后台。做法是登录时生成一个随机token,比如用Now()+Rnd()+用户ID拼起来再取哈希,存到用户表login_token和token_expire,Cookie里写uid和token,过期时间7天。下次访问check.asp发现Session空但Cookie有值,就拿uid和token查库,比对成功且未过期再重建Session,同时更新token。token要一次性或滑动过期,别长期不变。Cookie设HttpOnly,经典ASP里Response.Cookies("admin_token").HttpOnly=True在较新IIS支持,不行就靠服务端校验。
权限判断也在check.asp里做。比如Session("admin_role")="super"才能进用户管理,普通编辑只能进内容页。可以在每个页面顶部设PageRole="user",check.asp里If PageRole<>"" And Session("admin_role")<>PageRole Then Response.Redirect "/admin/nopower.asp" : Response.End。别把权限判断写在前端JS里,那只能防手滑,防不了直接请求。

退出登录要Session.Abandon,清Cookie,Response.Redirect到登录页。Session.Abandon后当前页Session变量还在,直到页面结束,所以退出后马上Redirect加End。清Cookie用Response.Cookies("admin_token").Expires=DateAdd("d",-1,Now())。
常见坑:include路径写错导致check.asp没执行;页面开头有BOM或空格导致Redirect失败,报“HTTP头已发送”;登录页本身也include check.asp造成死循环;用Request("id")不验证类型导致注入。经典ASP没有框架兜底,判断登录这件事就是每个后台入口都过一遍check.asp,别漏AJAX接口。AJAX接口也要返回JSON前判断Session,未登录返回401或{"code":401},别返回登录页HTML,前端解析会炸。
数据上,Session超时默认20分钟,IIS站点“ASP”里“会话超时”可改;Cookie过期按需;token表加索引,查询用ADODB.Command参数化。判断登录不是写一行If就完事,关键是每个后台入口都执行、Redirect后End、Cookie不存明文身份、权限和账号状态一起看。这样后台才不会被一个地址栏就绕进去。