授权配置
在 IIS 中,对所有使用窗体身份验证的应用程序启用异步访问。urlauthorizationmodule 类用于帮助确保只有经过身份验证的用户才能访问页。
可以使用 authorization 元素配置 urlauthorizationmodule,如以下示例所示。
使用该设置将拒绝所有未经过身份验证的用户访问应用程序中的任何页。如果未经身份验证的用户试图访问某页,窗体身份验证模块将该用户重定向到 forms 元素的 loginurl 属性指定的登录页。
窗体身份验证控制流
图 1 显示窗体身份验证期间出现的事件顺序。
| • |
用户请求应用程序的虚拟目录下的 Default.aspx 文件。因为 IIS 元数据库中启用了匿名访问,因此 IIS 允许该请求。ASP.NET 确认 authorization 元素包括 <deny users="?" /> 标记。 |
| • |
服务器查找一个身份验证 Cookie。如果找不到该身份验证 Cookie,则用户重定向到配置好的登录页 (Login.aspx),该页由 forms 元素的 loginurl 属性。用户通过该窗体提供和提交凭据。有关起始页的信息存放在使用 RETURNURL 作为密钥的查询字符串中。服务器 HTTP 应答如下所示: 302 Found Location:
http://localhost/FormsAuthTest/login.aspx?RETURNURL=%2fFormAuthTest%2fDefault.aspx
|
| • |
浏览器请求 Login.aspx 页,并在查询字符串中包括 RETURNURL 参数。 |
| • |
服务器返回登录页以及 200 OK HTTP 状态代码。 |
| • |
用户在登录页输入凭据,并将该页(包括来自查询字符串的 RETURNURL 参数)发送回服务器。 |
| • |
服务器根据某个存储(如 SQL Server 数据库或 Active Directory 用户存储)验证用户凭据。登录页中的代码创建一个包含为该会话设置的窗体身份验证票的 Cookie。 在 ASP.NET 2.0 中,可以通过成员身份系统执行对用户凭据的验证。membership 类为此提供了 validateuser 方法,如下所示: if (Membership.ValidateUser(userName.Text, password.Text))
{
if (Request.QueryString["ReturnUrl"] != null)
{
FormsAuthentication.RedirectFromLoginPage(userName.Text, false);
}
else
{
FormsAuthentication.SetAuthCookie(userName.Text, false);
}
}
else
{
Response.Write("Invalid UserID and Password");
}
注 使用 login Web 服务器控件时,它自动为您执行以下步骤。下文使用了前面提供的代码。 |
| • |
对于经过身份验证的用户,服务器将浏览器重定向到查询字符串中的 RETURNURL 参数指定的原始 URL。服务器 HTTP 应答如下所示: 302 Found Location:
http://localhost/TestSample/default.aspx
|
| • |
重定向之后,浏览器再次请求 Default.aspx 页。该请求包括身份验证 Cookie。 |
| • |
FormsAuthenticationModule 类检测窗体身份验证 Cookie 并对用户进行身份验证。身份验证成功后,formsauthenticationmodule 类使用有关经过身份验证的用户的信息填充当前的 user 属性(由 httpcontext 对象公开)。 |
| • |
由于服务器已经验证了身份验证 Cookie,因此它允许访问并返回 Default.aspx 页。 |
formsauthenticationmodule
asp.net 2.0 在计算机级 Web.config 文件中定义了一组 HTTP 模块,包括大量身份验证模块,如下所示:
... ...
每个请求只能使用一个身份验证模块。所使用的身份验证模块取决于 authentication 元素(通常位于应用程序的虚拟目录中的 Web.config 文件中)指定了哪种身份验证模式。
当 Web.config 文件中包含以下元素时,激活 formsauthenticationmodule 类。
FormsAuthenticationModule 类构造一个 genericprincipal 对象并将其存储在 HTTP 上下文中。genericprincipal 对象保存对一个 formsidentity 实例的引用,该实例代表当前经过身份验证的用户。应该允许窗体身份验证为您管理这些任务。如果应用程序有特定要求(例如,将 user 属性设置为一个实现 iprincipal 接口的自定义类),则该应用程序应该处理 postauthenticate 事件。formsauthenticationmodule 验证了窗体身份验证 Cookie 并创建了 genericprincipal 和 formsidentity 对象之后,会发生 postauthenticate 事件。在该代码中,可以构造一个包装 formsidentity 对象的自定义 iprincipal 对象,然后将它存储在 httpcontext. User 属性中。
注 如果执行了这一操作,还需要设置 Thread.CurrentPrincipal 属性上的 IPrincipal 引用,以确保 HttpContext 对象和该线程指向相同的身份验证信息。
窗体身份验证 Cookie
调用 formsauthentication.setauthcookie 或formsauthentication.redirectfromloginpage 方法时,formsauthentication 类自动创建身份验证 Cookie。
典型的窗体身份验证 Cookie 中包括以下属性:
| • |
Name。该属性指定 Cookie 的名称。 | ||
| • |
Value。该属性指定 Cookie 的值。 在典型的窗体身份验证 Cookie 中,该值包含一个经过加密和签名的 formsauthenticationticket 对象的字符串表示形式。该 Cookie 包含以下属性: | ||
| • |
Expires。该属性指定 Cookie 的到期日期和时间。仅当代码指示应该颁发一个持久的窗体身份验证 Cookie,窗体身份验证才设置该值。 | ||
| • |
Domain。该属性指定与 Cookie 关联的域。默认值为 null。
| ||
| • |
HttpOnly。该属性指定是否可以通过客户端脚本访问该 Cookie。在 ASP.NET 2.0 中,该值始终设置为 true。Internet Explorer 6 Service Pack 1 支持该 Cookie 属性,从而防止客户端脚本从 document.cookie 属性访问该 Cookie。如果尝试从客户端脚本访问该 Cookie,则返回一个空字符串。无论何时用户浏览到当前域中的 Web 站点,该 Cookie 仍然发送至服务器。 注 不支持 httponly Cookie 属性的 Web 浏览器要么忽略该 Cookie,要么忽略该属性,这意味着会话仍然容易受到跨站点脚本的攻击。 | ||
| • |
Path。该属性指定 Cookie 的虚拟路径。默认值为"/",代表根目录。 | ||
| • |
Secure。该属性指出 Cookie 是否应该仅通过 HTTPS 连接传输。secure 属性应设置为 true,以便该 Cookie 可以受 SSL 加密的保护。 | ||
| • |
Version。该属性指定 Cookie 的版本号。 |
相关专题
- .NET移动与嵌入式技术 (5968篇文章)
- .NET开发手册 (5669篇文章)
- ASP.NET教程 (8464篇文章)
- .NET框架架构 (467篇文章)
- ASP.NET应用篇 (2639篇文章)
- .NET开发人员犯的6大安全错误 (6次浏览)
- 请跟我来--使用Ext搞个原型 (1次浏览)
- ASP.NET 3.5 Extensions带来什么 (1次浏览)
- 应用WEB标准会使ScrollTop属性失效! (0次浏览)
- Cache用法之缓存页面和缓存数据 (0次浏览)
- 支持正则表达式的UrlMapping (0次浏览)
- 关于ASP.NET 2.0的目录结构变化 (0次浏览)
- WPF中Closing窗体时调用Hide()方法异常 (0次浏览)
- 对象数组根据某属性列的灵活排序 (0次浏览)
- DB2 9和ASP.NET 2.0构建下一代应用程序 (0次浏览)




