前段时间用
ASP.NET
做一个网站,其中有个要求是网站里有些页面或功能需要用户登录后才能浏览或使用。
应该没有什么问题,因为
ASP.NET
提供了完善的身份验证服务。
ASP.NET
与
IIS
一起使用以支持身份验证。有四种验证方式供君选择:
None
,
Windows
,
Form
以及
Passport
。
Passport
我不知道怎么用,而
None
又不知道有什么用,估计是逗你玩。用
Form
吧,系统会将未经身份验证的请求重定向到登录页,验证通过后,系统又自动转向此前请求的页面,正适合网站的要求。
“我,只用力士。”——国际影星娜塔莎·金丝姬。
现在问题是,怎样来控制哪些页面需要身份验证,哪些可以随便浏览?
身份验证在配置文件
web.config
里定义。在一个网站里,可能存在多个
web.config
。比如,根目录下有一个,某些子目录下又各有一个。按我的理解,
web.config
就好象面向对象里的类,具有继承和重载的特性,比如说,假设有个属性,子目录下的
web.config
没有重新定义,则继承根目录下的定义,否则以自己的定义为准。
这样子,针对我们这个网站的要求,只要在根目录下定义默认是允许所有人访问,然后再对特定的页面和子目录定义为拒绝匿名访问,不就搞定了吗?
假设有个网站
web
,其下有子目录
s1
,
s2
,文件
default.aspx
,
info.aspx
,
login.aspx
。
要求根目录下文件
info.aspx
、子目录
s1
需要经过身份验证才可浏览,其余可自由浏览,则根目录
web.config
定义如下:
<
system.web
>
<authentication mode="Forms" >
<!-- 登陆页面为login.aspx -->
<forms name="web" loginUrl="login.aspx" protection="All" timeout="120"/>
</authentication>
<authorization>
<allow users="*" /> <!-- 允许所有用户 -->
</authorization>
</system.web>
<location path="s1"><!—子目录s1拒绝匿名访问,必须先登陆 -->
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</location>
<location path="info.aspx"><!—页面info.aspx拒绝匿名访问,必须先登陆 -->
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</location>
这样子设置后,
info.aspx
,
\s1\*.*
都要先经过身份验证才可访问,否则,系统将自动转向登陆页面
login.aspx
。
假如子目录
s1
里有文件例外,例如
welcome.aspx
不需要身份验证,则在
s1/web.config
里定义
<
configuration
>
<location path="welcome.aspx"> <!-- 允许所有用户 -->
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>
</configuration>