ASP+安全身份验证的实现

.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类型的文件来存储配置信息,你可用notepadXML编辑器方便地修改其内容,规定的设置方式是子目录继承或者覆盖从父目录得来的配置设定,就是说在root目录下放了个config.web文件,那么任何下一级目录将自动继承这个文件中的配置,假如某个子目录需要另外的配置时,我们可再另建一个config.web放在该子目录下。这种配置管理方式对安装你的应用程序、配置的修改及安全管理都极为有利。

ASP+
提供了三种主要的身份验证方式即:WindowsCookiePassportWindows是指使用Windows自身的安全管理方式,你可通过设置Windows的用户及IIS等权限来保障安全,对于一些大应用,使用此方法将非常复杂和烦琐。Passport方式较为方便和安全,用户只用一个用户名和密码可以访问任何成员站,并且在注销离开时,所有Passport相关的信息都会清除,你可以在公共场所放心地使用它,相信Passport比较适合Internet的应用。在企业级应用中,使用Cookie方式和SSLIP限制等一些网管技术同样可以实现一定的安全性。

下面介绍一下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.aspxlogin.aspx这两个ASP+程序。

login.aspx
程序内容如下:

%@ Import Namespace="System.Web.Security" %
%@ Import Namespace="System.Data" %
%@ Import Namespace="System.Data.ADO" %
html
head
titleLogin/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");
//
让用户重输入新用户名、密码
}
/script><body><center
h3><font face="Verdana".NET身份验证系统提示你</font></h3
span id="Welcome" runat=server/><form runat=server
input type="submit" OnServerClick= "Signout_Click" Value="取消该登录身份" runat="server"/><p

/form><p><a href="/adduser/">进入管理室</a></p></center></body></html

具体执行时,当一个未经认证的用户浏览你的网站的.aspx文件时(注意,Cookie认证只对.aspx文件起作用),系统发现该用户没Cookie,于是将它重定向到login.aspx,当用户输入正确的用户名和密码后,系统为该用户生成一个Cookie并立刻自动重定向到一开始该用户要浏览的.aspx文件并执行它,缺省的则定向到Default.aspx,上面提供的Default.aspx则提示你已经通过身份认证。

总结
由于我们使用了Session跟踪应用程序访问或会话期间特定的Web浏览器信息,带有相应的 cookie HTTP请求被认为是来自同一Web浏览器,所以要防止被人使用Sniffer等方法非法截获Cookie信息,你需要考虑使用SSL或其他安全的通讯链路加密方法。

对于上述程序,你可以方便地在Table中加入用户IP地址的信息,来验证Intranet用户。由于Cookie就像一个身份证,为防止有人非法使用你的Cookie,应该让Cookie随着浏览器的关闭一起清除。

总之,使用Cookie的身份验证方法再结合各种加密手段以及操作系统完善的安全配置就可以为大多数需要安全认证的应用提供足够的支持。