ASP.NET中的表格认证之二

asp.net

简介

本文的第二部分主要是介绍如何使用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 blnIsAuthenticated Then
FormsAuthentication.RedirectFromLoginPage(strUser, chkPersistLogin.Checked)
End If

End Sub

Function GetHashedPass(ByVal aPassword As String) As String
Return FormsAuthentication.HashPasswordForStoringInConfigFile(aPassword,"sha1")
End Function
</script>

<html>
<head>
<title>Custom Forms Authentication Login Form</title>
</head>

<body bgcolor="#FFFFFF" text="#000000">
<form runat="server">
<table width="400" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="80">Username : </td>
<td width="10"> </td>
<td><asp:TextBox Id="txtUser" runat="server"/></td>
</tr>
<tr>
<td>Password : </td>
<td width="10"> </td>
<td><asp:TextBox Id="txtPassword" TextMode="Password" runat="server"/></td>
</tr>
<tr>
<tr>
<td></td>
<td width="10"> </td>
<td><asp:CheckBox id="chkPersistLogin" runat="server" />Remember my credentials
<br>
</td>
</tr>
<tr>
<td> </td>
<td width="10"> </td>
<td><asp:Button Id="cmdLogin" Text="Login" runat="server" /></td>
</tr>
</table>
<br>
<br>
<div id="ErrorMessage" runat="server" />
</form>
</body>
</html>
Login.aspx详解

在本例中,我添加了对System.Web.Security和System.Xml的引用,因为我们将会用到这二个名字空间中的类。我们还编写了一个名字为ProcessLogin的过程,它的作用是检查表格数据(用户名和口令)与XML文件中所包含的口令和用户名是否相同。

首先,我们为文本编辑框创建了一些局部变量。由于需要得到users.xml文件的全路径,因此我们使用了

Request.PhysicalPath方法,然后对脚本文件名进行整理。另外我们还创建了一个变量,保存经过哈希处理后的口令。

其次,我们将XMLDoc.Load方法调用放在Try...Catch语句中。Try...Catch语句是ASP.NET中新增添的,它是处理错误和异常的一种很好的方式。在下面的代码,我们将用户节点表作为一个变量数组,使用getElementsByTagName方法将XML文件中的用户节点赋给它。然后检查该用户是否存在,如果存在,则检查用户输入的口令是否与存储在XML文件中的相同。如果用户存在,而且口令也相同,我们就将blnIsAuthenticated的值勤设置为true。在过程的末尾,如果blnIsAuthenticated的值为true,我们就调用RedirectFromLoginPage方法。当然了,我们也可以使用SetAuthCookie方法来完成同样的功能,但不会把用户引导到另一个网页。

在login.aspx文件的接口或HTML部分,我们有开发了2个服务器端正文框,1个服务器端复选框,1个按钮,在该按钮的onClick事件中,调用了ProcessLogin。我们还有一个在服务器端运行的div,它能够向用户显示出错信息。

Default.aspx概览

该文件中的代码与本篇文章第一部分的default.aspx文件相同。

Default.aspx的代码

<%@Page Language="VB" %>
<%@Import Namespace="System.Web.Security" %>
<script language="vb" runat="server">
Sub SignOut(objSender As Object, objArgs As EventArgs)
删除用户认证的cookie并退出
FormsAuthentication.SignOut()
将用户引导到提交的网页
Response.Redirect(Request.UrlReferrer.ToString())
End Sub

Sub Page_Load()
验证认证
If User.Identity.IsAuthenticated Then
显示认证信息
displayCredentials.InnerHtml = "Current User : <b>" & User.Identity.Name & _
"</b><br><br>Authentication Used : <b>" & _
User.Identity.AuthenticationType & "</b>"
Else
显示错误信息
displayCredentials.InnerHtml = "Sorry, you have not been authenticated."
cmdSignOut.disabled = True
End If

End Sub
</script>
<html>
<head>
<title>Forms Authentication</title>
</head>

<body bgcolor="#FFFFFF" text="#000000">
<span class="Header">Forms Based Authentication using Custom Method</span>
<br>
<br>
<div id="displayCredentials" runat="server" />
<br>
<br>
<form runat="server">
<input id="cmdSignOut" type="submit" Value="Sign Out" runat="server" onserverclick="SignOut" /><p />
</form>
</body>
</html>
Default.aspx详解

该网页与本文第一部分中的default.aspx的功能完全相同,它只是简单地显示用户名和使用的认证方法。

HashPassword.aspx概览

这个网页允许一个未经认证的用户创建加密的口令,它可以用于在Web.config的credentials小节、XML文件或数据库中存储口令。

<ccid_nobr><b>HashPassword.aspx代码</b></ccid_nobr>
<%@Page Language="VB" %>
<%@Import Namespace="System.Web.Security" %>
<script language="VB" runat="server">
Sub GetHashedPass(objSender As Object, objArgs As EventArgs)
Dim strEncPass As String
strEncPass = FormsAuthentication.HashPasswordForStoringInConfigFile(txtPassword.Value,"sha1")
hashedPass.InnerHtml = "Hashed Password for Web.config, XML File or Database<br><b>" & _
strEncPass & "</b>"
End Sub
</script>
<html>
<head>
<title>Create Hashed Password</title>
</head>

<body bgcolor="#FFFFFF" text="#000000">
<b>Create Hashed Password</b>
<form runat="server">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>Password to encrypt:
<input id="txtPassword" type="password" runat="server" name="text"/>

<input type="submit" value="Hash Pass" runat="server" onserverclick="GetHashedPass"/>
</td>
</tr>
<tr>
<tr>
<td> </td>
</tr>
<tr>
<td>
<div id="hashedPass" runat="server"/>
</td>
</tr>
</table>
</form>
</body>
</html>

HashPassword.aspx详解

为了使用Forms Authentication名字空间,我们需要再次使用System.Web.Security名字空间。这里,我们使用一个过程接收文本框的文本,并使用SHA1哈希算法对它进行哈希处理。完成这一功能的方法的名字是HashPasswordForStoringInConfigFile(这很可能是我看到的最长的方法名字了),该方法接收二个参数,一个是需要进行哈希处理的字符串,另一个是要使用的算法,在该方法中,我们可以使用SHA1或MD5算法。

结束语

就象在上面的稿子中看到的那样,在Web应用程序的开发中,表格认证是一个功能强大的工具。如果能够掌握好它的使用,会给我们的开发工作带来很大的方便。

时间: 2024-10-22 01:29:05

ASP.NET中的表格认证之二的相关文章

ASP.NET中的表格认证之一

asp.net 简介 ASP开发人员总是自己解决认证问题,但ASP.NET已经支持内置的认证功能.在本篇文章中,我们将介绍如何这二者在认证方面有什么变化,如何用很少的代码使用FormsAuthentication使用网站更安全. 在ASP编程中,无论是使用集成的安全协议(例如Windows NT LAN Manager [NTLM]的寻问/应答认证协议),基本的安全协议(指纯文本)还是自己创建的安全协议,其工作量都是十分惊人的.表格认证使开发人员能够在Web.config文件中存储用户名.口令等

怎么实现在ASP.NET中制作表格,并将数据库中数据定位到特定的单元格中,谢谢了

问题描述 怎么实现在ASP.NET中制作表格,并将数据库中数据定位到特定的单元格中,谢谢了 现须在ASP.NET的网页中显示报表,报表的格式如下(红框里的是固定不变的,绿框的数据从数据库调用).表格要求:表格样式不变,显示数据库里的数据. 之前尝试用repeater.Gridview控件但都不能将数据定位到特定单元格上.问各位大神,怎么实现这个功能.在下感激不尽! 图片说明 解决方案 GridView可以将数据定位到单元格上,只是你不能简单的数据绑定,你需要用循环配合gridview.rows[

PHP中用户身份认证实现二法(2)

PHP中用户身份认证实现二法(2)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> AddType application/x-httpd-php4 .php3AddType application/x-httpd-php4 .php4Action application/x-httpd-php4 /php4/php.exe 要想使PHP支持更多的后缀名,没问题.在给出的

在ASP.NET中实现MVC模式(二)

asp.net 在ASP.NET中实现Model-View-Controller模式(二) MVC模式形容这种实现方式是一种被动的实现机制,ASP.NET充当了程序执行中的控制器的角色,但程序员必须将具体的事件处理方法添加到事件的响应函数中.如在这个例子中,控制器在页面加载之前调用Page_Load函数并执行其中的代码,当用户点击Submit按钮时由系统调用SubmitBtn_Click函数并执行. 这种将代码都包含在一个文件中的实现方式非常的直接,而且当应用程序很小并不经常修改的时候也可以说是

asp.net5中的用户认证与授权(1)_实用技巧

就在最近一段时间,微软又有大动作了,在IDE方面除了给我们发布了Viausl Studio 2013 社区版还发布了全新的Visual Studio 2015 Preview. asp.net5中,关于用户的认证和授权提供了非常丰富的功能,如果结合ef7的话,可以自动生成相关的数据库表,调用也很方便. 但是,要理解这么一大堆关于认证授权的类,或者想按照自己项目的特定要求对认证授权进行定制,确实很头疼.为了解决这个问题,需要从根本上理解认证和授权的机制,不过这不是个简单的事情,一些概念也比较抽象,

PHP中用户身份认证实现二法

用户在设计和维护站点的时候,经常需要限制对某些重要文件或信息的访问.通常,我们可以采用内置于WEB服务器的基于HTTP协议的用户身份验证机制.当访问者浏览受保护页面时,客户端浏览器会弹出对话窗口要求用户输入用户名和密码,对用户的身份进行验证,以决定用户是否有权访问页面.下面用两种方法来说明其实现原理. 一.用HTTP标头来实现 标头是服务器以HTTP协议传送HTML信息到浏览器前所送出的字串.HTTP采用一种挑战/响应模式对试图进入受密码保护区域的用户进行身份验证.具体来说,当用户首次向WEB服

请问类似文本编辑控件在Asp.net中如何实现!

问题描述 请问类似文本编辑控件在Asp.net中如何实现! 解决方案 解决方案二:自己先顶!大家帮帮忙啊!解决方案三:网上已经有很多了,没有必要再自己写了!不过实现起来不是很难,只是很磨叽!HTML+JS就可以实现!解决方案四:DotNetTextBox,fckeditor都可以.

在ASP中使用Oracle数据库技巧(二)

如果已经真正地理解了我们在上面讨论的一些方法(Edit.Update和AddNew),也许有的读者已经知道该如何在Oracle数据库中删除记录了. <% '删除所有符合上面条件的记录  OraDynaset.Delete %> 在Oracle8i中搜索和更新数据记录的代码 1)搜索   <%          'RetriveRecProc.asp -使用ASP的Oracle Objects for OLE更新数据记录          %>        <%  '定义作为

ASP.NET中根据XML动态创建并使用WEB组件(二)

asp.net|web|xml|创建|动态 ASP.NET中根据XML动态创建使用WEB组件 (二) 作者:厉铁帅 三.动态创建WEB组件. 先来看程序实例: private void createconfigtable(int totalnum,int[] sequenceint,string[] namestr,string[] ipstr) { //根据得到测量点的总数,动态生成输入框 for(int i=1;i<=totalnum;i++) { //创建表格 HtmlTable show