简介
ASP开发人员总是自己解决认证问题,但ASP.NET已经支持内置的认证功能。在本篇文章中,我们将介绍如何这二者在认证方面有什么变化,如何用很少的代码使用FormsAuthentication使用网站更安全。
在ASP编程中,无论是使用集成的安全协议(例如Windows NT LAN Manager [NTLM]的寻问/应答认证协议),基本的安全协议(指纯文本)还是自己创建的安全协议,其工作量都是十分惊人的。表格认证使开发人员能够在Web.config文件中存储用户名、口令等认证信息,当然,也可以使用你自己原来的方法,例如数据库、XML文件或文本文件。使用表格认证最大的好处是它可以使我们无需再通过编程实现状态跟踪,这一部分工作由ASP.NET代劳了。
表格认证的背景知识
表格认证使用cookies使应用程序在用户访问期间对用户进行跟踪,ASP.NET处理表格认证的方法与在ASP中使用的方式非常相似。当用户通过表格认证登录后,就会创建一个用来跟踪用户访问网站期间活动的cookie。如果用户请求一个安全的网页,但又没有登录,用户就会被引导到登录网页。一旦用户通过认证,就会被引导到原来请求的页面。
标准的表格认证设置
- 使用的网页:Default.aspx、Login.aspx、Web.config。
- 在表格认证的标准方法中,所有的用户信息都被存储在Web.config。
- 在互联网服务器的根目录下创建一个名字为standardForms的文件夹。
- 使该文件夹成为互联网服务管理器的一个应用。
Web.config概述
Web.config文件包含ASP.NET应用程序的所有配置设置,其理念是让许多开发人员共同控制Web应用程序,而不是由系统管理员一个人来控制。当然了,Web.config中有很多的选项,但今天我们只介绍与表格认证有关的选项。
使用标准或信任方法的Web.config代码
认证
属性描述名字:用于认证的cookie的名字。提示:如果多个应用要在同一台计算机上使用FormsAuthentication,最好使用不同的名字。路径:cookie的路径。缺省的“/”值能够避免路径中的大小写错误,因为在返回cookie上,浏览器是对大小写敏感的。LoginUrl:未经认证的用户被引导到的URL。保护:用来保护cookie数据的方法。缺省和建议的值是“All”,它会进行确认和加密。Timeout:cookie结束前的时间(以分钟计)。证书
属性描述口令格式:口令被存储的格式,可用的值包括Clear、SHA1和MD5。SHA1和MD5是使口令在Web.config文件中存储更安全的哈希算法。用户:用于存储用户名和口令。我们可以通过运行HashPasswordForStoringInConfigFile函数对口令进行哈希处理,在后面我们会演示这种方法。
授权
属性 描述拒绝 | 允许:这一小节拒绝或允许用户访问站点。?代表匿名或未被认证的用户,*表示所有的用户。另外,它还能让我们向某一用户授予允许或拒绝其他用户访问的权限。
Web.config Code
<configuration>
<system.web>
<customErrors mode="Off"/>
<authentication mode="Forms">
<forms name="appNameAuth" path="/" loginUrl="login.aspx"
protection="All" timeout="30">
<credentials passwordFormat="Clear">
<user name="jeff" password="test" />
<user name="mike" password="test" />
</credentials>
</forms>
</authentication>
<authorization>
<deny users="?" />
</authorization>
</system.web>
</configuration>
Web.config细节
在上面的Web.config中,我们配置了几个选项。
认证
配置小节的mode属性设置表格的认证模式,在小节中我们将name属性指定为“AppNameAuth”。也许想将cookie的名字改为“HRWebAuth”。
需要记住的是,如果在计算机上有多个应用,建议为每个cookie命名一个名字。
接下来,我们将path属性设置为应用的根目录,将loginUrl属性设置为本地机上一个名字为loginUrl.aspx的网页,当然我们也可以使用https://secured.sumnurv.com这样的URL,将protection属性设置为建议的“all”,这意味着cookie不但会被加密,还会被确认有效。
确认算法来自Machine.config中的machineKey元素,数据确认有助于确保cookie的数据在传输的过程中不会被篡改。
timeout属性指的是一个cookie终止、用户再次登录之前的以分钟计的时间。在credentials小节中,我们添加二个用户以及它们的口令,FormsAuthentication将使用它们对用户进行认证。
授权
在authorization小节中,我们希望没有非授权的用户能够访问应用。“?”表示匿名用户,因此我们对所有的匿名用户设置一个deny标志。
Login.aspx概述
所有用户的认证逻辑都在这里完成。如果想根据Web.config、XML或文本文件、数据库验证用户的证书,那么验证工作就是在这里完成的。下面的例子根据Web.config验证用户的证书。
Login.aspx Code
<%@Page Language="VB" %>
<%@Import Namespace="System.Web.Security" %>
<script language="VB" runat="server">
Sub ProcessLogin(objSender As Object, objArgs As EventArgs)
If FormsAuthentication.Authenticate(txtUser.Text, txtPassword.Text) Then
FormsAuthentication.RedirectFromLoginPage(txtUser.Text, chkPersistLogin.Checked)
Else
ErrorMessage.InnerHtml = "<b>Something went wrong...</b> please
re-enter your credentials..."
End If
End Sub
</script>
<html>
<head>
<title>Standard Forms Authentication Login Form</title