简介
ASP开发人员总是自己解决认证问题,但ASP.NET已经支持内置的认证功能。在本篇文章中,我们将介绍如何这二者在认证方面有什么变化,如何用很少的代码使用FormsAuthentication使用网站更安全。
在ASP编程中,无论是使用集成的安全协议(例如Windows NT LAN Manager [NTLM]的寻问/应答认证协议),基本的安全协议(指纯文本)还是自己创建的安全协议,其工作量都是十分惊人的。表格认证使开发人员能够在Web.config文件中存储用户名、口令等认证信息,当然,也可以使用你自己原来的方法,例如数据库、XML文件或文本文件。使用表格认证最大的好处是它可以使我们无需再通过编程实现状态跟踪,这一部分工作由ASP.NET代劳了。
表格认证使用cookies使应用程序在用户访问期间对用户进行跟踪,ASP.NET处理表格认证的方法与在ASP中使用的方式非常相似。当用户通过表格认证登录后,就会创建一个用来跟踪用户访问网站期间活动的cookie。如果用户请求一个安全的网页,但又没有登录,用户就会被引导到登录网页。一旦用户通过认证,就会被引导到原来请求的页面。
Web.config文件包含ASP.NET应用程序的所有配置设置,其理念是让许多开发人员共同控制Web应用程序,而不是由系统管理员一个人来控制。当然了,Web.config中有很多的选项,但今天我们只介绍与表格认证有关的选项。
| 属性 | 描述 |
| 名字: | 用于认证的cookie的名字。提示:如果多个应用要在同一台计算机上使用FormsAuthentication,最好使用不同的名字。 |
| 路径: | cookie的路径。缺省的“/”值能够避免路径中的大小写错误,因为在返回cookie上,浏览器是对大小写敏感的。 |
| LoginUrl: | 未经认证的用户被引导到的URL。 |
| 保护: | 用来保护cookie数据的方法。缺省和建议的值是“All”,它会进行确认和加密。 |
| Timeout: | cookie结束前的时间(以分钟计)。 |
| 属性 | 描述 |
| 口令格式: | 口令被存储的格式,可用的值包括Clear、SHA1和MD5。SHA1和MD5是使口令在Web.config文件中存储更安全的哈希算法。 |
| 用户: | 用于存储用户名和口令。我们可以通过运行HashPasswordForStoringInConfigFile函数对口令进行哈希处理,在后面我们会演示这种方法。 |
| 属性 | 描述 |
| 拒绝 | 允许: | 这一小节拒绝或允许用户访问站点。?代表匿名或未被认证的用户,*表示所有的用户。另外,它还能让我们向某一用户授予允许或拒绝其他用户访问的权限。 |
| <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中,我们配置了几个选项。
配置小节的mode属性设置表格的认证模式,在
需要记住的是,如果在计算机上有多个应用,建议为每个cookie命名一个名字。
接下来,我们将path属性设置为应用的根目录,将loginUrl属性设置为本地机上一个名字为loginUrl.aspx的网页,当然我们也可以使用https://secured.sumnurv.com这样的URL,将protection属性设置为建议的“all”,这意味着cookie不但会被加密,还会被确认有效。
确认算法来自Machine.config中的machineKey元素,数据确认有助于确保cookie的数据在传输的过程中不会被篡改。
timeout属性指的是一个cookie终止、用户再次登录之前的以分钟计的时间。在credentials小节中,我们添加二个用户以及它们的口令,FormsAuthentication将使用它们对用户进行认证。
在authorization小节中,我们希望没有非授权的用户能够访问应用。“?”表示匿名用户,因此我们对所有的匿名用户设置一个deny标志。
所有用户的认证逻辑都在这里完成。如果想根据Web.config、XML或文本文件、数据库验证用户的证书,那么验证工作就是在这里完成的。下面的例子根据Web.config验证用户的证书。
| <%@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> |
由于还需要进行认证,因此在上面的代码中引用了System.Web.Security名字空间,FormsAuthentication是System.Web.Security名字空间中的一个类。在本例中,我们使用了一个带有分别用来输入用户名、口令的文本框、口令输入字段,还有一个复选框,方便用户使用一个永久性的cookie集。“Submit”(提交)按钮有一个onclick事件,它执行一个名为ProcessLogin的子程序。在ProcessLogin内部,我们执行了FormsAuthentication类的Authenticate方法,用户名和口令是其二个参数。这一方法根据用户名和参数检查Web.config文件中信任状的标记。如果它们相符,我们执行RedirectFromLoginPage方法,该方法会向用户的机器中写入一个cookie,对用户的行为进行跟踪,并确保用户是经过认证的;如果不相符,就会发生错误,并通知用户。
这是用户请求或谋略访问的页。在本例中,我们将显示被认证用户和认证类型。
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> |
最新相关文章
发表评论