ASP.NET中的页面访问控制

1 、简介

ASP.NET 是建立微软 .Net 平台上的 WEB 编程框架,可用于在服务器上生成功能强大、结构清晰的 Web 应用程序。有必要指出的是,由于 ASP.NET 基于 .Net 公共语言运行库,因此在 ASP.NET 中可以利用整个 .Net 平台的全部功能。

本文通过对 ASP.NET 开发中的页面访问控制问题的描述,涉及到了 Request 、 Response 、 Session 、 Cookie 这几个对象,并对 ASP.NET 的工作方式 、 Session 安全性 、 AS P 页面的生命周期做了较为详细的分析,以期提供一个 ASP.NET 开发快速入门的参考。

2 、环境介绍及预备知识:

( 1 )、 Windows XP Professional(Windows 2000 、 Windows 2003)+IIS

( 2 )、 .Net Framework SDK 1.1 ( VS.Net 2003 中自带)

( 3 )、 Visual Studio.Net 2003

请根据指南正确对 IIS 、 VS.Net2003 的加以安装。使用 Windows2003 的用户:在 VS.Net 2003 安装好以后,请确认 IIS 中的 ASP.NET **** Web 服务扩展是 允许 的,否则,您将无法使用 ASP.NET 。

本文假设您能使用 C# 在 .Net 平台上做简单的 WinForm 开发,并了解一定的 HTML 知识。

3 、正文:

( 1 )、创建项目

启动 VS.NET 2003 ,选择菜单命令新建 -> 项目,弹出新建项目对话框,新建一个 ASP.NET 项目,本文里使用的项目位置为 http://localhost/WebApplication1 。

单击确认, IDE 将创建项目。在解决方案管理器中,我们可以发现 IDE 自动为我们添加了一个名位 WebForm1.aspx 的页面,请删掉它,然后为我们的项目添加两个 ASP.NET 页面,名称分别为 SignIn.aspx 、 Protected.aspx 。

查看 SignIn.aspx 的 HTML 代码,在第一行你可以发现:

1@ Page language="c#" Codebehind="SignIn.aspx.cs" AutoEventWireup="false" Inherits="WebApplication1.SignIn" 

很有必要介绍一下 Codebehind 属性和 Inherits 属性。 ASP.NET 较之 ASP 一个最大的进步,就是实现了 Web 开发中 HTML 代码(负责呈现用户界面)和程序代码(负责实现业务逻辑)的分离。

ASP.NET 页面在运行时,首先时被解释加以编译成为一个类,这个类继承了 Inherits 属性指定的预先编译在程序集中的类,然后 ASP.NET 页面编译后生成的类被启动来处理请求( 注意 :继承的方式在 ASP.NET2.0 中已被取消,在 2.0 版本中,页面连同程序代码编译成同一类)。

有了上面的叙述,我们可以知道 Codebehind 属性指示了 ASP.NET 页面所要继承父类的代码文件(提示:在 ASPX 页面中添加了 WEB 控件后,然后打开页面对应的代码文件,查看父类代码发生了那些变化,你将了解上述的 ASP.NET 页面执行模式)。

( 2 )、完成代码

查看 SignIn.aspx 的 HTML 代码,在

1<font face="  宋体  "> 和  </font>

中插入如下非常常见的 HTML 代码:

用户名 :

1<input name="username" size="16" type="text"/>
1<br/>

密码 :

1<input name="password" size="16" type="password"/>
1<br/>
1<input name="Submit" type="submit" value="  登入  "/>
1<input name="Reset" type="reset" value="  重  填  "/>

然后切换到 SigIn.aspx 页面的设计视图,如下所示:
![](http://dev.csdn.net/article/42/C:/Documents and Settings\陈杰\My Documents\My Pictures\design.JPG)

在登入按钮上单击鼠标右键,选择“作为服务器控件运行”,我们可以发现,登入按钮的左上角多了一个带边框的绿色小三角,如此将两个文本框也转换为服务器控件。

在 ASP.NET 中,服务器控件具有在服务器上可见并可编程的属性。在上述操作中,我们通过将 HTML 元素转换为 HTML 服务器控件,将其公开为可在服务器上编程的元素,这使得我们可以使用类似 WinForm 编 程的方法来使用它们( 提示 :原有的 HTML 设计代码可以按同样的方法非常方便的重用到 ASPX 页面中)。

双击登入按钮,窗口切换到代码文件 SignIn.aspx.cs ,你可以发现, IDE 已经自动添加了该按钮的事件处理函数,在该函数里填入我们的程序代码,如下:

private void Submit1_ServerClick( object sender, System.EventArgs e)

{

if (Text1.Value=="asp"&&Password1.Value=="net")

{

// 填入 Session ,用作权限控制

Session["USERNAME"]="asp";

Session["AccessCount"] = 1;

// 创建 Cookie

System.Web.HttpCookie cookie= new HttpCookie("UserInfo");

cookie["UserName"] = "asp";

cookie["AccessCount"] = "1";

cookie.Expires = DateTime.Now.AddDays(30);

Response.Cookies.Add(cookie);

// 重定向到受保护页面

Response.Redirect("Protected.aspx?Message=Parameter In Url");

}

}

上述程序代码非常简单,参看注释可以快速理解。这里值得提一下的是 Session 的安全性和 Cookie 的安全性问题。

我们知道, HTTP 是无状态的,但是 Web 应用必须提供对某些跨请求状态信息的维持,最常见的例子就是 Web 购物站点的购物车,因此所有的 Web 编程环境均提供了会话 (Session) 支持。在 ASP.NET 中,会话都是使用 120 位的 SessionID 字符串进行标识和跟踪的 , SessionID 值是使用保证唯一性和随机性的算法(例如 MD5 算法)生成的, SessionID 随机性使得怀有恶意的用户不能使用新的 SessionID 来计算现有会话的 SessionID 。

在默认状态下 , SessionID 是保存在客户端的会话 Cookie 中的,假如客户端禁用了 Cookie ,通过设置 Web.config 文件中的 < sessionState> 节点的属性 cookieless ="true" ,你可以使得 SessionID 附在 URL 中。此时,在你的 Session 有效期内,假如你将你的 SessionID(从URL中获得) 告诉你的朋友,他就可以使用你的 SessionID 从其它机器访问同一个 Web 应用,他将和你同用一个的 Session 内容。这个情况说明了实现 SessionID 的唯一性和随机性的原因所在。

SessionID 由客户端加以维护,保存在会话 Cookie 中或 URL 中。会话状态则由服务端维护, ASP.NET 中有三种会话状态的存储模式。您可以在进程内、状态服务器( StateServer )和 SQL Server 之间选择。具体设置可以参考如下 MSDN 。

Session 是面向用户的,它不能跨 Web 应用程序边界。所谓的在本地自建相同 Session 就可以访问其他 Web 站点的说法是无稽之谈。从应用的角度来看, Session 是安全的,且无法伪造。但是 这并不是说 ,使用 Session 的 Web 站点是绝对安全的!最后,值得指出的是,黑客攻击中的会话劫持不是劫持 Web 应用中的 Session ,而是指网络应用连接,例如 HTTP 会话、 Telnet <SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Tahoma; mso-bidi-font-size: 10.5pt; ms

Published At
Categories with Web编程
Tagged with
comments powered by Disqus