.Net新手☞基础(Cookie、Session等)
CSS是Cascading Style Sheets(层叠样式表)
样式表摘要:
有四种方式可以在HTML文件中使用样式表:
1、在<head>区段中使用<link>元素
2、在<head>区段的<style>元素标签内使用@import规则
3、在文件的<head>区段中插入<style>元素标签
4、在HTML标签内加入样式属性
CSS样式的基本语法:
选择器
{
color:#ffffff;
font-family:"Lucida Grande",Verdana,Lucida,Arial,Helvetica,宋体,sans-serif;
}
一般选择器有6种:
1、普通选择器
直接声明某个标签的样式属性,比如:
body
{
font-family:Verdana;
font-size:9pt;
}
2、群选择器
几个标签样式属性一样时,可以共同调用一个声明,样式之间用“逗号”分隔,比如:
input,tr{font-size:9pt;}
3、派生选择器
可以使用派生选择器给一个标签里的子标签定义样式
span strong
{
font-style:italic;
font-weight:normal;
}
4、ID选择器
可以单独为某个标签定义样式,比如有一个<div>
<div id="mydiv">文字</div>
然后在样式表里这样定义:
#mydiv {background-color:Red;}
5、类别选择器
在CSS里用一个“点”开头表示类别选择器定义,比如:
.10ptWhite
{
color:#000000;
font-size:10pt;
}
在标签中,使用class="类别名"的方法调用,这个方法比较灵活,可以为不同的标签使用相同的CSS,比如:
<div class="10ptWhite">文字</div>中,“文字”就以10pt的白色显示。
注意:CSS是区分大小写的。
6、伪类选择器
CSS用4个伪类来定义链接的各种状态,分别是a:link、a:visited、a:hover和a:active,比如:
a:link{text-decoration:none;color:#000000;}
a:visited{text-decoration:none;color:#0000ff;}
a:hover{text-decoration:underline;colo:#ff0000;}
a:active{text-decoration:none;color:#000000;}
以上语句分别定义了“链接、已访问过的链接、鼠标停在上方时、单击鼠标时”的样式。如果使用这段CSS来定义的话,链接未访问的时候是黑色无下划线;鼠标停在上方时是红色带下划线;单击鼠标时又是黑色无下划线;链接被访问过以后是蓝色无下划线的。
注意:必须按以上顺序写,否则显示可能和预想的不一样。记住它们的顺序是LVHA。
7、印刷伪元素
使用印刷伪元素,可以对<p>元素的首行和首字指定印刷效果
首行伪元素:
实现第一行与其他行样式不同。
格式为:p:first-line{}
例子:p:first-line{font-variant:small-caps;color:blue}将实现将第一行以蓝色与小写字母显示
以下样式属性可以应用于首行元素:font、color、background、word-spacing、letter-spacing、text-decoration、vertical-align、text-transform、line-height,以及clear
首字伪元素:
首字伪元素用于常见的印刷效果,像是将文章的第一个字改为大写或者放大。
格式为:p:first-letter{}
例子:p:first-letter{font-size:24;float:left}
以下样式属性可以应用于首字元素:font、color、background、text-decoration、vertical-align、text-transform、line-height、margin properties、padding、border、float以及clear
8、选择器中的伪元素
如果要想在项目的所有页面上都应用该样式,那就这样做: 在web.config中的<system.web>节下加上句<pages theme="..."/>
本地化和资源---创建多语言网站
1、生成本地化资源
执行“工具”----“生成本地化资源”命令即可完成本地化资源的建立。如login.aspx.resx
2、创建多语言资源文件
把上面生成的本地化资源复制两份,分别重命名为login.aspx.zh-cn.resx,login.aspx.en-us.resx(命名方法是 页面名.页面类型.语言代号.resx)
其中login.aspx.zh-cn.resx中的语言都要改成英文。
3、实现多语言切换
(1)、选择IE浏览器“菜单”---“工具”---“Internet选项”---“常规页”---“语言”。
(2)、单击“添加”---“选择英语(美国)”并单击“确定”。
(3)、把列表“英语(美国)”上移到第一行,单击“确定”。
生成本地化资源html语言会出现Culture和UICulture属性。Culture值确定与区域有关的函数,如日期、数字和货币格式等。UICulture值确定为页加载哪些资源。
我们可以为整个站点统一应用全球化设置,在Web.config文件的<system.web>中添加如下节点即可。
<globalization culture="auto" uiCulture="auto"/>
4、以编程方式访问本地资源
public string str
{
get {retuen (string)base.GetLocalResourceObject("newResource.Text");}
set {tb_Username.Text=value;}
}
5、创建和使用全局资源
(1)、右键单击项目,选择“添加新项”---“资源文件”,名称这里起Rescource.resx
(2)、打开Rescource.resx文件,任意添加一个字符串资源,这里我们添加名称为GlobalResourceText,值为“欢迎光临本站,竭诚为您服务!”
(3)、在任何页面的任何位置添加一个Label控件,单击Expressions,选择“Text”,表达式类型为Resources。ClassKey中填写全局资源文件的文件名,例如我们创建的文件名为Rescource.resx,这里我们填写Rescource。RescourceKey填写资源ID,这里我们填写GlobalResourceText。
(4)、这样我们就完成了。
(5)、访问全局资源很简单,如下:string s=Rescources.Rescource.GlobalResourceText;
导航控件和站点地图
1、为网站建立一个SiteMapPath控件。
2、为网站新建一个站点地图文件,保留原来的名字(Web.sitemap)。
3、打开Web.sitemap文件,修改如下:
<?xml version="1.0" encoding="utf-8"?>
<siteMap xmlns="http://schmas.micosoft.com/AspNet-File-1.0">
<siteMapNode url="Default.aspx" title="首页" description="显示所有分类和板块">
<siteMapNode url="TopicList.aspx" title="帖子列表" description="显示某一板块的主题帖">
</siteMapNode>
</siteMap>
如果想关联sitemappath和web.siteMap站点地图,可以在Web.config的<system.web>节点添加
<siteMap>
<providers>
<add siteMapFile="Web.sitemap" name="Websitemap" type="System.Web.XmlSiteMapProvider,System.Web,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"/>
</providers>
</siteMap>
然后设置SiteMapProvider,指向前面自定义的SiteMapProvider即可。
<asp:SiteMapPath ID="SiteMapPath1" runat="server" SiteMapProvider="Websitemap">
</asp:SiteMapPath>
字符串的操作
1、字符访问
string s="ABCDE";
Console.WriteLine(s[0]);ss//输出"A"
Console.WriteLine(s.Length);//输出4
2、打散
string s="ABCDE";
char[]arr=s.ToCharArray();//把字符串打散成字符数组
Console.WriteLine(arr[0]);//输出A
3、截取
string s="ABCDE";
Console.WriteLine(s.Substring(1));//从第2位开始截取一直到字符串结束,这里输出"BCD"
Console.WriteLine(s.Substring(2,2));//从第3位开始截取一直到字符串结束,这里输出"CD"
4、字符匹配
string s="ABCABCD";
Console.Write(s.IndexOf('A'));//从字符串头部开始搜索第一个匹配字符A的位置,输出0
Console.Write(s.IndexOf('BCD'));//从字符串头部开始搜索第一个匹配字符BCD的位置,输出4
Console.Write(s.LastIndexOf('C'));//从字符串尾部开始搜索第一个匹配字符C的位置,输出5
Console.Write(s.LastIndexOf('E'));//从字符串尾部开始搜索第一个匹配字符E的位置,输出-1
Console.Write(s.Contains("ABCD"));//判断字符串中是否存在另一个字符串"ABCD",输出TRUE
5、大小写转换
string s="aBcD";
Console.WriteLine(s.ToLower());//转换为小写,输出abcd
Console.WriteLine(s.ToUpper());//转换为大写,输出ABCD
6、对齐
string s="abcd";
Console.WriteLine(s.PadLeft(6,'_'));//使用'_'填充字符串左边,使其扩充到6位,输出__abcd
Console.WriteLine(s.PadRight(6,'_'));//使用'_'填充字符串右边,使其扩充到6位,输出abcd__
7、匹配移除
string s="__AB__CD__";
Console.WriteLine(s.Trim('_'));//移除字符串头部与尾部的'_'字符,输出AB__CD
Console.WriteLine(s.TrimStart('_'));//移除字符串头部的'_'字符,输出AB__CD__
Console.WriteLine(s.TrimEnd('_'));//移除字符串尾部的'_'字符,输出__AB__CD
8、插入和删除
string s="ADEF"
Console.WriteLine(s.Insert(1,BC));//输出ABCDER
Console.WriteLine(s.Remove(1,2));//从字符串第1位开始删除2个字符,输出ADEF
9、替换
string s="A_B_C_D";
Console.WriteLine(s.Replace('_','-'));把字符串中的"_"替换为"-",输出A-B-C-D
10、分割
string s="A,B,C,D";
string [] arr=s.Split(',');//以','字符对字符串进行分割,返回字符串数组arr[]={"A","B","C","D"}
11、格式化
Console.WriteLine(string.Format("{0}+{1}={2}",1,2,1+2));
12、连接
string s="A,B,C,D";
string [] arr=s.Split(',');返回字符串数组arr[]={"A","B","C","D"}
Console.WriteLine(string.Concat(arr));//将一个字符串数组连接成一个字符串,输出“ABCD”
Console.WriteLine(string.Join(",",arr));//以','作为分割符将一个字符串数组连接成一个字符串,输出“A,B,C,D”
StringBuilder sb=new StringBuilder();
sb.Append("A");
一、Cookie
从技术上讲,Cookie是一小段保存在客户端的数据。用户访问网站的时候,网站会给用户一个包含过期的Cookie,浏览器收到Cookie后就存放在客户端的文件夹下。以后用户每次访问网站页面的时候,浏览器会根据网站的URL在本地Cookie文件夹内查找是否存在当前网站关联的Cookie,如果有的话就连同页面请求一起发送到服务器。
关于Cookie的知识应注意一下几点:
(1)Cookie只是一段字符串,并不能执行。
(2)大多数浏览器规定Cookie大小不能大于4K,每个网站不超过20个Cookie,所有网站的Cookie总和不超过300个。
(3)除了Cookie外,几乎没有其他的方法在客户端的机器上写入数据(就连Cookie的写入操作也是浏览器进行的)。当然,连Cookie都可以通过浏览器安全配置来禁止。现在大多数网站都利用Cookie来保存一些数据(比如你的ID),以便你下次能直接“继续”以前的配置,所以建议不要轻易关闭Cookie。
Cookie毕竟是存放客户端的,因此,不要在Cookie中保存保密信息。
Cookie的相关操作
/// <summary>
/// Cookie Operate
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
///Save Cookie
protected void SaveCookie_Click(object sender, EventArgs e)
{
HttpCookie SingleValueCookie = new HttpCookie("test1");
SingleValueCookie.Value="单值Cookie";
SingleValueCookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(SingleValueCookie );
HttpCookie MultiValueCookie = new HttpCookie("test2");
MultiValueCookie.Values["key1"] = "value1";
MultiValueCookie.Values["key2"] = "value2";
MultiValueCookie.Expires = DateTime.Now.AddDays(1);
Response.Cookies.Add(MultiValueCookie );
}
//MultiValue Cookie
protected void MultiValueCookie_Click(object sender, EventArgs e)
{
HttpCookie SingleValueCookie=Request.Cookies["test1"];
SingleValueCookie.Value = "修改后的单值Cookie";
Response.Cookies.Add(SingleValueCookie );
}
//Read Cookie
protected void ReadCookie_Click(object sender, EventArgs e)
{
HttpCookie SingleValueCookie = Request.Cookies["test1"];
if(SingleValueCookie!=null )
{
Response.Write(string.Format("key:{0}Value:{1}<br/>","test1",SingleValueCookie.Value,SingleValueCookie.Expires ));
}
HttpCookie MultiValueCookie=Request.Cookies["test2"];
if(MultiValueCookie!=null )
{
Response.Write(string.Format("Key:{0}Value:{1}<br/>","test2",MultiValueCookie.Value));
foreach(string subkey in MultiValueCookie.Values.AllKeys )
{
Response.Write(string.Format("SubKey:{0}Value:{1}Expiress:{2}<br/>",subkey,MultiValueCookie.Values[subkey],MultiValueCookie.Expires ));
}
}
}
///<summary>
///Delete Cookie
///1、从Request对象中获取Cookie 2、把Cookie的过期时间设置为过去的时间 3、把Cookie重新写回Response中
///</summary>
protected void DeleteCookie_Click(object sender, EventArgs e)
{
foreach (string key in Request.Cookies.AllKeys)
{
HttpCookie cookie=Request.Cookies[key];
cookie.Expires = DateTime.MinValue;
Response.Cookies.Add(cookie );
}
}
二、application与session的区别
application 是在不同的电脑上访问同一个网站,都是对同一个变量进行操作。
session 是在不同的电脑上访问的同一个网站,但控制的都是针对自己电脑的变量。
ASP.NET提供存储SessionID的模式:
1、Cookie(默认)。如果客户端禁止了Cookie的使用,Session也将失效。
2、URL。Cookie是否开启并不影响Session的使用,缺点是不能使用绝对链接。
ASP.NET提供存储Session内容的模式:
1、InProc(默认)。Session存储在IIS进程中(Web服务器内存)。
2、StateServer。Session存储在独立的Windows服务进程中(可以不是Web服务器)。
3、SqlServer。Session存储在SqlServer数据库的表中(SqlServer服务器)。
把Session存储在独立的进程中步骤:
第一步:打开状态服务。依次打开“控制面板”--“管理工具”--“服务”命令,找到ASP.NET状态服务一项,右键单击服务选择启动。
如果决定使用状态服务存储Session,别忘记修改服务为自启动,以免忘记启动服务而造成网站Session不能使用。
服务正常启动后可以观察任务管理器,其中的aspnet_state.exe进程就是状态服务进程。
第二步:在system.web节点写入:
<sessionState mode="StateServer" stateConnectionString="tcpip=127.0.0.1:42424" stateNetworkTimeOut="20"></sessionState>
第三步:可序化和反序列化。可序化是指将对象实例的状态存储到存储媒体的过程。在此过程中,先将对象的公共字段和私有字段以及类的名称转换成字节流,然后再把字节流写入数据流。在随后对对象进行反序列化时,将创建出与原对象完全相同的副本。要使一个类可序化,最简单的方法是使用Serializable属性对它进行标记。例如:
[Serializable]
class MyUser
{
public string sUserName;
public string ToString()
{}
}
把Session存储在数据库中
1、在命令提示窗口输入cmd,并在命令行中运行如下命令:
C:\Windows\microsoft.net\framework\v2.0.50727\aspnet_regsql.exe -S .\SqlExpress -E -ssadd
其中-S指定SqlServer服务器地址,-E表示采用信任连接,-ssadd表示为SqlServer服务器添加状态服务的支持。操作结束后,可以看到数据库中多了一个ASPState数据库
2、打开Web.config,写入下面代码:
<sessionState mode="SQLServer" sqlConnectionString="sever=(local);Trusted_Connection=True" sqlCommandTimeOut="60"></sessionState>
3:可序化和反序列化。
session的使用范围:使用同一个客户端(浏览器实例)访问同一个应用程序的所有页面。
session的大小限制:
如果使用InPro模式的session,存储过多的数据会导致IIS进程被收回,引发session不断丢失。
如果使用StateServer存储session,那么数据在存入session以前需要进行序列化,序列化会消耗大量的CPU资源。
如果使用SqlServer模式的session,数据不但要序列化而且还有存储在硬盘上,更不适合存储大量的数据。
session的生命周期
session采用一种平滑超时技术来控制何时销毁session。默认情况下,session的超时时间是20分钟,用户保持20分钟不访问网站,则session被收回;如果在这20分钟内用户又访问了网站,那么20分钟就重新计时。这个超时时间可以通过Web.config来修改:
<sessionState timeout="30"></sessionState>
或者在程序中设置:
Session.Timeout="30";
session是否存在,不仅仅依赖TimeOut属性,下面的情况都能引起session丢失:
1、bin目录中的文件被修改。
2、SessionID丢失或无效。
3、如果使用InPro模式的session,那么IIS重启将会丢失session。如果使用StateServer存储session,服务器重新启动session也丢失。
从安全性角度考虑,建议不要使用cookieless和SqlServer模式的session。
遍历与销毁Session
遍历session集合
System.Collections.IEnumerator SessionEnum=Session.Keys.GetEnumerator();
while(SessionEnum.MoveNext())
{
Response.Write(Session[SessionEnum.Current.ToString()].ToString()+"<br/>");
}
如果仅仅是为了监视session,也可以通过trace来获得详细信息,在Web.config的system.web节点添加:
<trace enable="true" pageOutput="true"/>
销毁session
Session.Abandon();
Application全局应用程序类
在服务器内存中存储数量较少又独立于用户请求的数据。由于它的访问速度非常的快,而且只要应用程序不停止,数据一直存在,我们通常在Application_Start的时候去初始化一些数据,在以后的访问中可以迅速访问和检索。
右键单击网站,选择“添加新项”命令,选择全局应用程序类。
application与session的用法差不多。唯一要注意的是,application的作用范围是整个应用程序,可能有很多用户在同一时间访问application造成混乱,因此在修改application时要先锁定application,修改完成后再解锁。代码如下:
Application.Lock();
Application的相关操作
Application.UnLock();
Cache概述
Cache中提供的缓存过期策略:
1、永不过期。和Application一样,缓存永不过期。
2、绝对时间过期。缓存在某一时间过期,比如5分钟。
3、变化时间过期(平滑过期)。缓存在某一时间内未访问则过期。
4、依赖过期。缓存依赖于数据库中的数据或者文件中的内容。一旦数据库中某些表的数据发生变化或者文件内容发生变动,则缓存自动过期。
缓存过期后我们就要更新缓存,ASP.NET提供两种更新策略。
1、被动更新。缓存过期后手动进行更新。
2、主动更新。缓存过期后在回调方法中更新。
using System.Diagnostics;//用于精确测定时间间隔
using System.Web.Caching;//用于缓存的策略
Stopwatch sw=new Stopwatch();
sw.Start();
sw.ElapsedTicks
//Stopwatch类用于精确测定逝去的时间,ElapsedTicks属性返回了时间间隔的计数器刻度,即系统的计数器走过了多少次。
DataSet ds=new DataSet();
Cache.Insert("Data",ds);//永不过期
DataSet ds=new DataSet();
Cache.Insert("Data",ds,null,DataTime.Now.AddSeconds(10),TimeSpan.Zero);//绝对时间过期DataTime.Now.AddSeconds(10)表示缓存10秒后过期,TimeSpan.Zero表示不使用平滑过期策略。
DataSet ds=new DataSet();
Cache.Insert("Data",ds,null,DataTime.MaxValue,TimeSpan.FromSeconds(10));//变化时间过期(平滑过期)。DataTime.MaxValue表示不使用绝对时间过期策略,TimeSpan.FromSeconds(10)表示缓存连续10秒没人访问就过期。
在这里,我们都使用Insert()方法来添加缓存。其实,Cache还有一个方法Add()方法也能向缓存中添加项。不同之处在于Add()方法只能添加缓存中没有的项,如果添加缓存中已有的项将失败(但不抛出异常),而Insert()方法能覆盖原来的项。
注意,和application不同,这里不需要使用在插入缓存的时候进行锁操作,Cache会自己处理并发。
缓存的回调功能让缓存过期后自动续建实现自动更新。
Cache.Insert("Data",ds,null,DataTime.Now.AddSeconds(10),TimeSpan.Zero,CacheItemPriority.Default,CacheRemovedCallback)
移除缓存:Cache.Remove("Data");
以人为本的Profile
可以使用Profile制作个性化页面
<!--设置Profile-->
<anonymousIdentification enabled="true"/>
<profile automaticSaveEnabled="true ">
<properties>
<group name="UI">
<add name="ForeColor" defaultValue="Black" allowAnonymous="true " type="string"/>
<add name="EnableBold" defaultValue="fale" allowAnonymous="true " type="bool"/>
</group>
</properties>
</profile>
说明:
1、<anonymousIdentification enabled="true"/>表示对匿名用户也启用Profile,系统会给匿名用户分配一个随机字符串组成的ID。
2、<profile automaticSaveEnabled="true ">表示自动在页面请求结束的时候保存Profile的设置到数据库中。
3、<properties>就是正式定义Profile的格式了,在每一个<group>中的才是真正的Profile。name表示Profile的名字,defaultValue表示默认值,allowAnonymous表示匿名用户是否可以使用,type表示数据类型。
调用Profile的方法是:
Profile.UI.ForeColor=ddl_TextColor.SelectedValue;
Profile.UI.EnableBlod=cb_IsBlod.Checked;
Profile总结
1、存储物理位置:客户端Cookie/URL和服务器数据库
2、存储类型限制:可序列化类型
3、状态使用范围:当前请求的上下文。对每个用户独立
4、存储大小限制:任意大小,读取写入频繁的数据不建议存入Profile
5、生命周期: 与关联的Cookie的生命周期一样
6、安全与性能: 数据总是存储在服务器端,安全性比较高,但不易存储过多数据。
7、优缺点与注意事项:可以方便的保存用户(匿名用户和已登录用户)的设置。
其他
QueryString
在很多时候我们希望跨页面传输数据,最常用的方法是使用GET方法提交数据。也就是在URL中附加一段QUERYSTRING(类似news.aspx?ID=1这样的效果),因此,有的时候我们不需要通过程序就能传输QUERYSTRING。不过,应注意一下几点:
1、IE浏览器对URL长度限制在2083个字符内。由于QUERYTRING是在URL中传输的,所以也受到了限制。
2、在URL中传输的数据都是明文的,而且客户端随时可以更改,因此,不要传输敏感数据。
3、在URL中传汉字或者一些特殊字符需要进行URL编码后传递,接受的时候再反编码,否则传递的数据可能出现乱码或者被截取。
string s="编程快乐!@#$%&*()";
Response.Redirect(Request.Url.AbsolutePath+"?data="+HttpUtility.UrlEncode(s));
接受的时候:
if(Request.QueryString["data"]!=null)
Response.Write(HttpUtility.UrlDecode(Request.QueryString["data"]));
强类型DataSet
1、单击右键,选择“添加新项”--“数据集”,并改名为GuestBook
2、在"TableAdapter配置向导"对话框选择一个数据连接,一直单击下一步,到完成。
ASP.NET不仅为我们生成强类型数据集,而且还能自动根据输入的select查询语句生成一系列CRUD操作方法:
1、填充DataTable。把数据填充到传入的DataTable中
2、返回DataTable。返回包含数据的DataTable。
3、插入修改和删除操作。直接对单个行进行插入、更新和删除操作。
程序如下:
GuestBookTableAdapters.tbGuestBookTableAdapter top = new GuestBookTableAdapters.tbGuestBookTableAdapter();
top.Insert(Guid.NewGuid(), tb_UserName.Text, DateTime.Now, tb_Message.Text, false ,"Good");
ClientScript.RegisterStartupScript(this.GetType(),"","<script>alert('发表成功')</script>");
请求上下文
防图片盗链、防文件下载及IP黑名单 通过HttpHandler和HttpModule,能在一个更高的层次来控制请求。
在.NET中将几个内置对象和其他几个与上下文有关的对象捆绑在一起,形成一个内部多项HttpContext,来跟踪HTTP请求的上下文。
HttpContext中几个比较重要的内置对象
1、Applilcation
2、ApplilcationInstance
3、Cache
4、Session
5、Request
6、Response
7、Server
8、Trace
9、User
10、Profile
HttpHandler
配置IIS
在IIS中新建一个虚拟目录,然后指向我们的程序集。右键单击虚拟目录,选择属性,会看到“虚拟目录选项卡”选项卡,选择“虚拟目录”选项卡,选择“配置”,将弹出“应用程序配置窗口”,单击“添加”,跳出“添加/编辑应用程序扩展名映射”窗口,在“可执行文件”后输出:“C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll”
在“扩展名”后输人:.jpg,单击确定。利用同样的方法注册.gif、.png等。这样设置的这些指定的图片扩展名就由我们的应用程序来处理了。
ASP.NET安全机制
安全相关的名词:
1、身份验证。许多Web应用程序的一个重要部分是能够识别用户和控制对资源的访问。确定请求实体的标识的行为称为身份验证。通常,用户必须提供凭证(如名称/密码对)才能进行身份验证。
2、授权。一旦经过身份验证的标志可用,就必须确定该标志是否可以访问给定的资源,此过程称为授权。ASP.NET与IIS一起使用为应用程序提供身份验证和授权服务。
3、模拟。在默认情况下,ASP.NET使用本地系统账号的权限执行(而不是请求的用户),使用模拟后,ASP.NET应用程序可以用发出请求的用户的Windows标志(用户账户)执行。
4、基于角色的安全性。对于一个庞大的用户系统,我们不能为每一个用户都单独授权,如果把用户分成不同的角色,然后对角色进行授权,那么这个工作就简单了。