|
简介
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> </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" width="150" runat="server"/></td> </tr> <tr> <td>Password : </td> <td width="10"> </td> <td><asp:TextBox Id="txtPassword" width="150" TextMode="Password" runat="server"/></td> </tr> <tr> <tr> <td></td> <td width="10"> </td> <td><asp:CheckBox id="chkPersistLogin" runat="server" />Remember my credentials </td> </tr> <tr> <td> </td> <td width="10"> </td> <td><asp:Button Id="cmdLogin" OnClick="ProcessLogin" Text="Login" runat="server" /></td> </tr> </table>
<div id="ErrorMessage" runat="server" /> </form> </body> </html> |
Login.aspx的详细解释
由于还需要进行认证,因此在上面的代码中引用了System.Web.Security名字空间,FormsAuthentication是System.Web.Security名字空间中的一个类。在本例中,我们使用了一个带有分别用来输入用户名、口令的文本框、口令输入字段,还有一个复选框,方便用户使用一个永久性的cookie集。“Submit”(提交)按钮有一个onclick事件,它执行一个名为ProcessLogin的子程序。在ProcessLogin内部,我们执行了FormsAuthentication类的Authenticate方法,用户名和口令是其二个参数。这一方法根据用户名和参数检查Web.config文件中信任状的标记。如果它们相符,我们执行RedirectFromLoginPage方法,该方法会向用户的机器中写入一个cookie,对用户的行为进行跟踪,并确保用户是经过认证的;如果不相符,就会发生错误,并通知用户。
Default.aspx概述
这是用户请求或谋略访问的页。在本例中,我们将显示被认证用户和认证类型。
Default.aspx Code
<%@Page Language="VB" %> <%@Import Namespace="System.Web.Security" %> <script language="vb" runat="server"> Sub SignOut(objSender As Object, objArgs As EventArgs) 'delete the users auth cookie and sign out FormsAuthentication.SignOut() 'redirect the user to their referring page Response.Redirect(Request.UrlReferrer.ToString()) End Sub Sub Page_Load() 'verify authentication If User.Identity.IsAuthenticated Then 'display Credential information displayCredentials.InnerHtml = "Current User : <b>" & User.Identity.Name & "</b>" & _ "Authentication Used : <b>" & User.Identity.AuthenticationType & "</b>" Else 'Display Error Message displayCredentials.InnerHtml = "Sorry, you have not been authenticated." End If End Sub </script> <html> <head> <title>Forms Authentication</title> </head> <body bgcolor="#FFFFFF" text="#000000"> <span class="Header">Forms Based Authentication using standard method</span>
<div id="displayCredentials" runat="server" />
<form runat="server"> <asp:Button id="cmdSignOut" text="Sign Out" runat="server" onClick="SignOut" /> </form> </body> </html> |
由于需要其中的一些方法和属性,在这里我再次使用了System.Web.Security名字空间。空间页中包含一个简单的div元素,还有一个input元素,它运行一个删除用户的cookie的子程序。在Page_Load事件中,我们使用User.Identity.IsAuthenticated属性检查用户是否已经得到了认证,返回的布尔型值表示用户是否通过了认证。如果用户通过了认证,我们希望返回用户的名字和使用的认证方法。使用 User.Identity.Name属性,我们就能够得到用户的名字,Identity.AuthenticationType返回使用的认证方法。我们还使用了一个SignOut过程,允许用户离开网站,并删除用户计算机中的cookie,它甚至能够删除一些永久性的cookie。
结束语
通过这篇文章,希望广大读者能够对表格认证以及如何使用它有一个基本的了解,体会到ASP.NET在安全方面对ASP所作的改进。 |