### 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 类型的文件来存储配置信息，你可用 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");
//让用户重输入新用户名、密码
}
＜/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 的身份验证方法再结合各种加密手段以及操作系统完善的安全配置就可以为大多数需要安全认证的应用提供足够的支持。