您的位置:首页 > 其它

基于表单的身份验证

2008-09-28 15:33 232 查看

15.4 基于表单的身份验证

15.4.1 概述

如果我们需要为网站创建一套自定义的用户注册系统,那么基于表单的身份验证(下称表单验证)是非常合适的。因此,我们可以使用任何的载体来存储用户名和密码(比如配置文件或者数据库)。表单验证通过cookie来判断用户票据,如果一个没有通过身份验证的用户请求一个页面,那么他会被自动转到登录页面,用户登录后又会转到原来的请求页面。
表单验证不负责提供完整的登录验证、用户注册等操作,它仅仅对用户进行身份验证,将未经身份验证的用户重定向到登录页,并执行所有必要的 Cookie 管理。
基于表单的身份验证,其整个过程如图15-18所示。

15.4.2 启用表单身份验证

要启用表单验证就必须完成以下步骤。
1.配置根目录Web.config文件的<authentication>节点,来启用表单验证。
2.配置必要目录Web.config文件的<authorization>节点,为指定目录关闭匿名访问权限。
3.创建一个登录页面,允许用户输入用户名和密码。



图15-18 基于表单的身份验证过程
一个典型的配置如下:
<configuration>
<system.web>
<authentication mode="Forms"/>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</configuration>
这样就设置了整个应用程序不允许匿名用户访问,未登录用户访问任何页面都会被转到登录页面(默认为Login.aspx)要求登录。

15.4.3 配置表单身份验证

在知道了如何启用表单身份验证后,让我们再来研究一下表单验证的一些配置选项。Web.config的<authentication>节点有一个可选的<forms>元素,它支持以下一些属性(现在的属性都设置为默认值)。
<authentication mode="Forms">
<forms
name=".ASPXAUTH"
loginUrl="login.aspx"
defaultUrl="default.aspx"
protection="All"
timeout="30"
path="/"
requireSSL="false"
slidingExpiration="true"
enableCrossAppRedirects="false"
cookieless="UseDeviceProfile"
domain="">
</forms>
</authentication>
每个属性各自的作用如下表所示。
属性说明
name指定要用于身份验证的HTTP Cookie。如果正在一台服务器上运行多个应用程序,并且每个应用程序都需要唯一的Cookie,则必须在每个应用程序的Web.config文件中配置Cookie名称。
默认值为“.ASPXAUTH”
loginUrl指定如果找不到任何有效的身份验证Cookie,将请求重定向到用于登录的URL。
默认值为login.aspx
defaultUrl定义在身份验证之后用于重定向的默认URL。
默认值为“default.aspx”
protection指定Cookie使用的加密类型(如果有)。
此属性可以为下列值之一:
All。指定应用程序同时使用数据验证和加密方法来保护Cookie。该选项使用已配置的数据验证算法,该算法基于machineKey元素。如果三重DES(3DES)可用并且密钥足够长(48位或更长),则使用三重DES进行加密。默认值(建议值)为All。
Encryption。指定对于将Cookie仅用于个性化并且具有较低的安全要求的站点,同时禁用加密和验证。请不要以此方式使用Cookie;但是,通过这种方法在.NET Framework中启用个性化占用的资源最少。
None。指定使用3DES或DES对Cookie进行加密,但不对Cookie执行数据验证。采用这种方式的Cookie可能受到精选的纯文本的攻击。
Validation。指定验证方案验证已加密的Cookie的内容在转换中是否未被更改。Cookie是使用Cookie验证创建的,方法是将验证密钥与Cookie数据相连接,然后计算消息身份验证代码(MAC),最后将MAC追加到传出Cookie。
默认值为All
timeout指定Cookie过期前逝去的时间(以整数分钟为单位)。如果SlidingExpiration属性为True,则timeout属性是滑动值,会在接收到上一个请求之后的指定时间(以分钟为单位)后过期。为防止危及性能并避免向开启Cookie警告的用户发出多个浏览器警告,当指定的时间逝去大半时将更新 Cookie。这可能导致精确性受损。持久性Cookie不超时。
默认值为30(分钟)
path为应用程序发出的Cookie指定路径
默认值是斜杠(/),这是因为大多数浏览器是区分大小写的,如果路径大小写不匹配,浏览器不会送回Cookie
requireSSL指定是否需要 SSL 连接来传输身份验证 Cookie。
此属性可以为下列值之一:
True。指定必须使用SSL连接来保护用户凭据。如果为True,则ASP.NET为身份验证Cookie设置 Secure属性,并且除非连接使用SSL,否则兼容的浏览器不会返回Cookie。
False。指定不要求使用 SSL 连接来传输 Cookie。默认值为 False。
默认值为False
续表
属性说明
Sliding-
Expiration
指定是否启用弹性过期时间。可调过期将Cookie的当前身份验证时间重置为在单个会话期间收到每个请求时过期。
此属性可以为下列值之一:
True。指定启用弹性过期时间。在单个会话期间,身份验证Cookie被刷新,并且每个后续请求的到期时间被重置。
False。指定不启用可调过期,并指定Cookie在最初发出之后,经过一段设定的时间间隔后过期。
默认值为False
enableCross-
AppRedirects
表明是否将通过身份验证的用户重定向到其他 Web 应用程序中的URL。
此属性可以为下列值之一:
True。指定将能够通过身份验证的用户重定向到其他 Web 应用程序中的URL。
False。指定将不能通过身份验证的用户重定向到其他Web应用程序中的URL。
默认值为False。
cookieless定义是否使用Cookie以及Cookie的行为。
此属性可以为下列值之一:
UseCookies。指定无论在什么设备上都始终使用Cookie。
UseUri。指定从不使用 Cookie。
AutoDetect。如果设备配置文件支持Cookie,则指定使用Cookie;否则不使用Cookie。对于已知支持Cookie 的桌面浏览器,将使用探测机制来尝试在启用Cookie时使用Cookie。如果设备不支持Cookie,将不使用探测机制。
UseDeviceProfile。如果浏览器支持Cookie,则指定使用Cookie;否则不使用Cookie。对于支持Cookie的设备,不尝试通过探测来确定是否已启用Cookie支持。
默认值为UseDeviceProfile
domain指定在传出Forms身份验证Cookie中设置的可选域。此设置的优先级高于httpCookies元素中使用的域。
默认值为空字符串("")

15.4.4 配置表单授权——一个限制匿名下载的例子

在介绍基于Windows的身份认证的时候,我们简单介绍了一下配置授权用户和角色的方法。其实,ASP.NET用于控制对URL资源的客户端访问。它对于用于生成请求的HTTP方法(GET或POST)是可配置的,并且可配置为允许或拒绝访问用户组或角色组。下面的配置演示向名为someone的用户和名为Admins的角色授予访问权。而所有其他用户的访问被拒绝。
<authorization>
<allow users="someone" />
<allow roles="Admins" />
<deny users="*" />
</authorization>
允许的授权指令元素为allow或deny。每个allow或deny元素都必须包含users或roles属性。通过提供一个逗号分配的列表,可在单个元素中指定多个用户或角色。
在第14章中,我们介绍了如何通过自定义HttpHandler来实现防图片盗链和匿名下载。其实,我们也可以通过使用ASP.NET授权机制来实现,以rar文件为例。
首先在网站下创建一个Download文件夹,然后在文件夹下放置一个11.rar文件,在文件夹下创建一个Web.config文件,用于配置授权。
<configuration>
<system.web>
<authorization>
<deny users="?" />
</authorization>
</system.web>
</configuration>
上述配置限制了匿名用户对这个文件夹中资源的访问。但是要让ASP.NET引擎“接管”对资源的授权,还需要为某个扩展名的文件添加ASP.NET映射。使用第14章介绍的方法,对网站的虚拟目录添加rar文件到ASP.NET引擎的映射,如图15-19所示。



图15-19 添加扩展名映射
现在,你输入http://localhost/Chapter15/Download/11.rar来尝试下载文件,ASP.NET会自动转到登录页面要求你登录。

15.4.5 登录与注销

那么,怎么通知表单验证用户已经登录,要求表单验证写入用户凭据,又怎么通知表单验证擦除用户凭据呢?
我们首先配置Web.config文件,启用表单验证,并且设置登录页面和默认首页的地址。
<?xml version="1.0"?>
<configuration>
<system.web>
<authentication mode="Forms">
<forms
name=".ASPXAUTH"
loginUrl="MyLogin.aspx"
defaultUrl="Download/Download.aspx">
</forms>
</authentication>
</system.web>
</configuration>
创建一个MyLogin.aspx,在页面上放置一个按钮控件和一个多选框控件。
<asp:CheckBox ID="cb_RememberMe" runat="server" Text="记住我?" />
<asp:Button ID="btn_Login" runat="server" Text="登录" />
双击登录按钮,单击事件处理方法如下:
protected void btn_Login_Click(object sender, EventArgs e)
{
FormsAuthentication.RedirectFromLoginPage("test", cb_RememberMe.Checked);
}
登录操作仅仅只需要一行代码。在这里,我们“通知”表单验证,名为test的用户已经通过身份验证,可以写入票据了。第二个bool型的参数指示是否要持久保留票据(用户以后访问这个页面不需要再次登录)。
为了简单,在这里我们没有根据用户的用户名和密码来判断用户是否是合法用户,RedirectFrom- LoginPage()方法做的仅仅是保存用户票据并把用户重定向到来源页面。
现在,在前一节中创建的Download目录下再创建一个Download.aspx页面。在这样页面上,我们添加一个链接用于下载文件,添加一个按钮用于退出操作。
<a href="11.rar">下载</a><br />
<asp:Button ID="btn_Logout" runat="server" Text="注销" />
注销按钮的单击事件处理方法如下:
protected void btn_Logout_Click(object sender, EventArgs e)
{
// 删除用户票据
FormsAuthentication.SignOut();
// 重定向到登录页面
FormsAuthentication.RedirectToLoginPage();
}
表单验证“接管”了票据的写入和擦除,我们没有对Cookie进行任何编码就实现了用户身份票据在Cookie中的保存和删除。
现在就可以开始测试了。
1.打开MyLogin.aspx进行登录,登录后页面直接转到默认的首页Download目录下的Download. aspx(根据defaultUrl属性的设置)。
2.直接打开通过身份验证用户才能访问的Download/Download.aspx,页面自动重定向到MyLogin. aspx(根据loginUrl属性的设置),要求用户登录,登录后还是自动回到Download.aspx。由于我们在前一节中已经添加了对rar文件的扩展名映射,因此未验证用户直接访问11.rar文件也会转到MyLogin. aspx。
3.测试永久持久票据。在登录的时候选中“记住我”复选框,如图15-20所示。
单击登录后页面转到下载页面,如图15-21所示。





图15-20 记住我功能 图15-21 下载页面
关闭浏览器后直接访问下载页面,发现页面能正常打开,说明用户票据确实被持久保存了。单击“注销”按钮,页面又回到了MyLogin.aspx。

15.4.6 使用Web.config进行身份验证

对于内部使用的小型系统,我们可能根本不需要对外开放注册等功能,而且用户的角色也相对单一,这时我们可以直接使用Web.config来保存用户名和密码,并且直接使用表单验证来验证。如下修改Web.config文件的<forms>部分:
<forms
name=".ASPXAUTH"
loginUrl="MyLogin.aspx"
defaultUrl="Download/Download.aspx">
<credentials passwordFormat="Clear">
<user name="test" password="test"/>
</credentials>
</forms>
在这里,我们用明文存储了用户名和密码(都是test),然后修改MyLogin.aspx登录按钮的单击事件处理方法。
protected void btn_Login_Click(object sender, EventArgs e)
{
if (FormsAuthentication.Authenticate("test", "test"))
FormsAuthentication.RedirectFromLoginPage("test", cb_RememberMe.Checked);
else
Response.Write("用户名或者密码错误");
}
通过Authenticate()方法就能直接对照配置文件中的凭据来验证用户名和密码。如果你觉得明文保存密码不合适,可以修改Web.config文件,选择“MD5”或者“SHA1”加密算法。你可能会问,怎么样知道一个密码对应的加密后密码是什么呢?不用担心,可以使用HashPasswordForStoringIn- ConfigFile()方法。修改MyLogin.aspx的Page_Load事件处理方法。
protected void Page_Load(object sender, EventArgs e)
{
Response.Write(FormsAuthentication.HashPasswordForStoringInConfigFile
("test","SHA1"));
}
上述代码输出了test这个密码经过SHA1加密后的密码,然后把这个密码放入Web.config中即可。
<credentials passwordFormat=:SHA1">
<user name="test" password="A94A8FE5CCB19BA61C4C0873D391E987982FBBD3"/>
</credentials>

15.4.7 获取用户信息

最后,我们来研究如何获取经过表单身份验证后的用户信息和用户凭据信息。在Download目录下创建一个UserInfo.aspx,如下修改Page_Load事件处理方法:
protected void Page_Load(object sender, EventArgs e)
{
if (User.Identity.IsAuthenticated)
{
FormsIdentity identity = User.Identity as FormsIdentity;
FormsAuthenticationTicket ticket = identity.Ticket;
Response.Write(string.Format("用户名:{0}<br/>", identity.Name));
Response.Write(string.Format("创建时间:{0}<br/>", ticket.IssueDate));
Response.Write(string.Format("过期时间:{0}<br/>", ticket.Expiration));
Response.Write(string.Format("是否持久:{0}<br/>", ticket.IsPersistent));
}
else
FormsAuthentication.RedirectToLoginPage();
}
在这里,我们输出了通过身份验证的用户名,以及身份票据的创建时间、过期时间和持久性,在MyLogin.aspx页面登录后(选择“记住我”)访问UserInfo.aspx页面的输出结果如图15-22所示。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: