日期:2009-11-30  浏览次数:20440 次

.NET平台及其ASP+所提供的强大开发功能是每个程序员所不能忽视的,对某种语言的偏好不该影响选择最具效率的开发工具。 而目前,ASP+确实提供了许多JSP所无法比拟的功能。
使用ASP+,你会真正感到使用语言的自由性,编程时在网页上可看到编译ASP+页中C#等语言时的全部编译信息,而且使用ASP+提供的数十种功能强大的服务器端控件,几乎可以实现以前客户端RAD开发工具所能实现的全部功能,ASP+可以直接方便地使用.NET中的XML技术,使用几个简单的函数就可以用XML替代一些数据库或和其他程序交换信息。
对于未来,将有越来越多的语言支持ASP+的开发,而富士通美国子公司已经推出了Cobol for .NET,让Cobol也可以开发ASP+应用程序了。惟一遗憾的是,ASP+目前还不能跑在除Windows系列的其他平台上,但这正是.NET正在做的事。
基于上述优点,越来越多的Web应用将会使用ASP+方式开发,在具体实现如电子商务等应用时,必须重视各种安全性问题,此问题涉及操作系统、网络管理及程序安全等众多方面,限于篇幅,本文将介绍如何用ASP+的配置和程序实现安全身份验证。
ASP+的相关配置
  ASP+的配置方法较特别,它使用config.web这个XML类型的文件来存储配置信息,你可用notepad或XML编辑器方便地修改其内容,规定的设置方式是子目录继承或者覆盖从父目录得来的配置设定,就是说在root目录下放了个config.web文件,那么任何下一级目录将自动继承这个文件中的配置,假如某个子目录需要另外的配置时,我们可再另建一个config.web放在该子目录下。这种配置管理方式对安装你的应用程序、配置的修改及安全管理都极为有利。
ASP+提供了三种主要的身份验证方式即:Windows、Cookie和Passport,Windows是指使用Windows自身的安全管理方式,你可通过设置Windows的用户及IIS等权限来保障安全,对于一些大应用,使用此方法将非常复杂和烦琐。Passport方式较为方便和安全,用户只用一个用户名和密码可以访问任何成员站,并且在注销离开时,所有Passport相关的信息都会清除,你可以在公共场所放心地使用它,相信Passport比较适合Internet的应用。在企业级应用中,使用Cookie方式和SSL、IP限制等一些网管技术同样可以实现一定的安全性。
下面介绍一下Cookie的配置:
  你需建一个如下内容的config.web,并将它放在C:\inetpub\wwwroot\(IIS缺省目录)下,对于系统安装时已经建立的config.web,一般在\WINNT\Microsoft.NET\Framework\v...目录下。
<configuration>
<security>
<authentication mode="Cookie">
<cookie decryptionkey="autogenerate" loginurl="/login.aspx" cookie=".ASPXAUTH" />
</authentication>
<authorization>
<deny users="?" />
</authorization>
</security>
</configuration>
  该配置文件声明用Cookie方式验证,在你访问该目录及其子目录下的aspx文件时,如果你没有认证的Cookie,它就会重定向到login.aspx。如果你需要一个不需要身份认证的目录(可放用户申请的程序)则可建一个如下的config.web并放在该目录下:
<configuration>
<security>
<authorization>
<allow users="*" />
</authorization>
</security>
</configuration>



程序设计
  你需在root目录下建立Default.aspx和login.aspx这两个ASP+程序。
login.aspx程序内容如下:



<%@ Import Namespace="System.Web.Security" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.ADO" %>
<html>
<head>
<title>Login</title>
<script language="C#" runat=server Debug="true" >
void Login_Click(Object sender, EventArgs e) {
if(Page.IsValid)
{ ADODataReader dr;
  // 连接数据库,用户名和密码放在ODBC连接的数据库QCDB中的表Users中
 ADOConnection cn = new ADOConnection("DSN=QCDB");
 cn.Open();
 ADOCommand cmdQuestion = new ADOCommand("SELECT Password FROM Users WHERE name = "" + YourName.Text + """, cn);
  //选择相应用户信息
 cmdQuestion.Execute(out dr);
  //建一个datareader得到SQL结果
 if(dr.Read()) //得到对应的第一个行数据
 if(dr["Password"].ToString() == Password.Text) 
   CookieAuthentication.RedirectFromLoginPage(YourName.Text, AbidingCookie.Checked);
 else //上面语句生成一个Cookie,如用户选择AbidingCookie,则永久保存Cookie
   Msg.Text = "密码错误";
 else
   Msg.Text = "用户名不存在";
 }
}
</script>
</head><center><body>
<ASP:Label id="Msg" ForeColor="red" Font-Name="Verdana";
Font-Size="18" runat=server />
<form runat=server>
<table><tr><td><ASP:label text="用户名: " runat=server/></td>
<td><ASP:textbox id="YourName" runat=server /></td>
</tr><tr><td><ASP:label text="密码:" runat=server/></td>
<td><ASP:textbox id="Password" TextMode="Password" runat=server /></td>
<td><ASP:button id="btnLogin" Text="确定" OnClick="Login_Click" runat=Server /></td>
<td> </td></tr><tr><td>希望下次不用输入密码</td>
<td><ASP:CheckBox id=AbidingCookie runat="server" /> </td>
<td></td></tr></td><td></td></tr></table>
</form></td> <td width="283" height="1" bgcolor="#F0F0F0"></td>
</tr></table></center></div><p></p></body>
</html>
Default.aspx程序内容如下:
<%@ Page LANGUAGE="c#" %>
<html><head><title>欢迎来到.NET的世界</title>
<script runat=server>
private void Page_Load(Object Src, EventArgs E )
{ Welcome.InnerHtml = "祝贺你通过身份验证" + Context.User.Identity.Name;
} private void Signout_Click(Object sender, EventArgs E)
{ CookieAuthentication.SignOut();
//按下SignOut按键清除原Cookie
Response.Redirect("login.aspx");
//让用户重输入新用户名、密码
}