日期:2014-03-16  浏览次数:20579 次

简介

本文的第二部分主要是介绍如何使用ASP.NET实现我们自己的表格认证的方法。在第一部分中,我们讨论了表格认证的基本概念和原理。在阅读本文的第二部分之前,读者需要了解表格认证的一些基本概念,或者已经阅读过第一部分。

自定义表格认证的建立

使用的页面:Default.aspx、Login.aspx、Web.config、Users.xml、HashPassword.aspx

在这个自定义表格认证的例子中,我们将自始至终地使用一个XML文档存储用户名和口令。建立该自定义表格认证所需要的一些准备工作:

  • 在互联网服务器的根目录下建立名字为customForms的目录。
  • 使该文件夹成为互联网服务管理器中的一个应用。
  • 创建名字为unsecure的子目录。
  • 创建名字为HashPassword.aspx的文件,并将它移到unsecure目录。



Web.config概览

Web.config文件中包含了Web应用程序的所有可配置的设置选项。我加亮显示了需要认真研究的代码:

Web.config代码

<configuration>
<system.web>
<customErrors mode="Off"/>

<authentication mode="Forms">
<forms name="AuthCookie" path="/" loginUrl="login.aspx" protection="All" timeout="10">
</forms>
</authentication>

<authorization>
<deny users="?" />
</authorization>

</system.web>
这部分加亮显示
<location path="unsecure">
<system.web>
<authorization>
<allow users="*"/>
</authorization>
</system.web>
</location>
这部分加亮显示
</configuration>



Web.config详解

这个例子增加了一个名字为location的配置小节,它允许我们覆盖Web.config文件中system.web配置小节的设置。在本例中,我们希望允许匿名或没有通过认证的用户访问unsecure目录,常见的例子是整个Web应用都是安全的,只有注册页是个例外。通过允许匿名用户访问一个目录,我们可以将能够被任何人浏览的文件存储到该目录中。如果有必要,我们可以创建多个location小节。

Users.xml概览

在这个文件中,我们存储了所有认证需要的数据,例如用户名和口令。口令采用了SHA1算法进行加密,稍后我们会对SHA1算法进行解释。

Users.xml代码

<?xml version="1.0"?>
<users>
<jeff>A94A8FE5CCB19BA61C4C0873D391E987982FBBD3</jeff>
<mike>A94A8FE5CCB19BA61C4C0873D391E987982FBBD3</mike>
</users>



Users.xml详解

在该文件中,有一个被称作users的小节,其中包含有每个用户的个人节点,在节点的开始、结束标志之间,有一个经过哈希处理的口令。很明显的是,该文件中也可以包含更多的信息,例如姓、名以及电话号码等。

Login.aspx概览

该文件包含对一个用户进行认证所需要的全部逻辑。在本例中,我们将使用一个XML文件对用户进行认证,当然了我们也可以将本页的逻辑用于使用一个数据库对用户进行认证。

Login.aspx代码

<%@Page Language="VB" %>
<%@Import Namespace="System.Web.Security" %>
<%@Import Namespace="System.Xml" %>

<script language="VB" runat="server">
Sub ProcessLogin(objSender As Object, objArgs As EventArgs)
Dim strCurrentPath As String = Request.PhysicalPath
Dim strXMLDocPath As String = Left(strCurrentPath, InStrRev(strCurrentPath, "\")) & "users.xml"
Dim strUser As String = txtUser.Text
Dim strPassword As String = txtPassword.Text
Dim strEncPassword As String = GetHashedPass(strPassword)
Dim blnIsAuthenticated As Boolean

Dim objXMLDoc As New XMLDocument()

Try
objXMLDoc.Load(strXMLDocPath)
Catch objError As Exception
ErrorMessage.innerHTML = "<b> The XML document could not be loaded.</b>.<br>" & _
objError.Message & "<br />" & objError.Source
Exit Sub
End Try

Dim UserNodes As XmlNodeList

UserNodes = objXMLDoc.GetElementsByTagName(strUser)

是否有用户名与输入的用户名相同的元素
If Not UserNodes Is Nothing Then
Dim blnUserExists As Boolean = True
Dim strUserCheck As String
Try
strUserCheck = UserNodes(0).FirstChild().Value
Catch objError As Exception
ErrorMessage.InnerHtml = "<b>Invalid username</b> please re-enter..."
blnUserExists = False
End Try
If blnUserExists = True Then
If strEncPassword = UserNodes(0).FirstChild().Value Then
blnIsAuthenticated = True
Else
ErrorMessage.InnerHtml = "<b>Invalid password</b> please re-enter..."
End If
End if
End If

If blnIsAut