ASP.NET安全性:
与 Microsoft Internet 信息服务 (IIS) 一起使用的 ASP.NET 可以使用以下任意一种身份验证方法来验证用户凭据(如用户名和密码):
1Windows:基本、摘要式或集成 Windows 身份验证(NTLM 或 Kerberos)。
2Forms 身份验证,您可以通过该身份验证在您的应用程序中创建登录页并管理身份验证。
3Microsoft Passport 身份验证
4客户证书身份验证
.net安全性
第一:权限
分类以及描述:
1代码访问权限,此权限表示对受保护资源的访问权或执行受保护操作的能力。
代码访问权限是用于帮助保护资源和操作不被未经授权地使用的权限对象。
它们是公共语言运行库用来在托管代码上强制安全性限制的机制的基本部分。
每种代码访问权限表示下列权限之一:
访问受保护资源(如文件或环境变量)的权限。
执行受保护操作(如访问非托管代码)的权限。
2标识权限,此权限指示代码具有支持特定类型的标识的凭据。
3基于角色的安全权限,此权限提供一种机制来确定用户(或代表用户的代理)是具有特定的身份还是指定角色的成员。PrincipalPermission 是唯一一个基于角色的安全权限。
1代码访问权限
1代码访问权限概述:
当今高度连接的计算机系统经常会遇到出自各种来源(可能包括未知来源)的代码。
代码可能由电子邮件附带、包含在文档中或通过 Internet 下载。
遗憾的是,许多计算机用户都亲身体验过恶意移动代码(包括病毒和蠕虫)造成的后果,
这些代码可能会损坏或毁坏数据,并会浪费时间和资金。
再比如:我们可以利用代码访问安全设置什么样的代码可以访问数据库,什么样的代码不可以访问
为了帮助保护计算机系统免受恶意移动代码的危害,让来源不明的代码安全运行,防止受信任的代码有意或无意地危害安全,.NET Framework 提供了一种称为"代码访问安全性"的安全机制。代码访问安全性使代码可以根据它所来自的位置以及代码标识的其他方面,获得不同等级的受信度。代码访问安全性还实施不同级别的对代码的信任,从而最大限度地减少了必须完全信任才能运行的代码的数量。使用代码访问安全性,可以减小恶意代码或包含错误的代码滥用您的代码的可能性。它可以减轻您的责任,因为您可以指定应该允许代码执行的一组操作,同时还可指定永远不允许代码执行的一组操作。代码访问安全性还有助于最大限度地减少由于代码中的安全脆弱性而造成的损害。
还是概述:
每种以公共语言运行库为目标的应用程序都必须与运行库的安全系统进行交互。
当应用程序执行时,运行库将自动对它进行计算,然后给它一个权限集。
根据应用程序(程序集)获得的权限不同,应用程序或者正常运行,或者发生安全性异常。
特定计算机上的本地安全设置最终决定代码所收到的权限。(通过属性可以实现在以后取完善元数据,程序集中的内容)
因为这些设置可能因计算机而异,所以您永远无法确保代码将收到运行所需的足够的权限。
这与非托管开发领域不同;在非托管开发领域,您不必担心运行代码所需的权限。
2编写类型安全代码:
若要使代码受益于代码访问安全性,必须使用将生成可验证为类型安全的代码的编译器。
PEVerify 工具 (Peverify.exe)提供生成 Microsoft 中间语言 (MSIL) 的开发人员(如编译器编写者、脚本引擎开发人员等)使用,帮助他们确定其 MSIL 代码及关联的元数据是否满足类型安全要求。某些编译器只有在您避免使用某些语言构造时才生成可验证的类型安全代码。如果您作为开发人员正在使用这样的编译器,则可能需要验证以确认您没有危害代码的类型安全性。在这种情况下,可以对文件运行 PE 验证工具来检查 MSIL 和元数据。
3通过声明式方法给代码设置权限的方法:
2强制性语法和声明式语法:
与运行库安全系统的交互使用强制性安全调用和声明式安全调用执行。
声明式调用使用属性执行;强制性调用在代码中使用类的新实例执行。
声明式安全性语法使用属性来将安全信息放到代码的元数据中。
有些调用只能强制性地执行,而有些调用只能以声明方式执行。
有些调用可以这两种方式中的任一种方式执行。
声明式语法:
SecurityAction 枚举
Demand 要求调用堆栈中的所有高级调用方都已被授予了当前权限对象所指定的权限
Assert 即使堆栈中的高级调用方未被授予访问当前权限对象所标识资源的权限,调用代码仍能访问该资源
Deny 即使调用方已被授予访问当前权限对象所指定资源的权限,调用方访问该资源的能力仍被拒绝
PermitOnly 即使代码已被授予访问其他资源的权限,也只能访问此权限对象所指定的资源
LinkDemand 要求直接调用方已被授予了指定的权限。
InheritanceDemand 要求继承此类或重写某一方法的派生类已被授予了指定的权限。
RequestMinimum 请求使代码运行所需的最小权限。此操作只能在程序集范围内使用。
RequestOptional 请求可选的附加权限(并非运行所必需的权限)。此请求隐式拒绝未明确请求的所有其他权限。此操作只能在程序集范围内使用。
RequestRefuse 请求不将可能被误用的权限授予调用代码。此操作只能在程序集范围内使用。
举一个例子来说明用法,其他例子,参考MSDN
RequestRefuse用法:
如果担心您的代码会被恶意地用来访问系统资源,则可以请求永远不向它授予相应的权限。
例如,浏览文件中的数据但从不修改数据的应用程序可能拒绝任何文件写入权限。
在发生 bug 或恶意攻击时,此代码不会损坏它操作的数据。
RequestRefuse 允许将大量权限作为可选的权限来请求,同时确保某些特定的权限不在授予之列
这些是安全性措施,比如我们网站上有段代码 要客户从自己的文件中选择一个文件,然后读取它,
如果这段代码中了病毒,可能会破坏用户的文件信息,但是我们可以设置其权限为只读,
这样即使代码被攻击,也不会破坏用户的文件
using System.Security.Permissions;
[assembly:FileIOPermission(SecurityAction.RequestRefuse ,Unrestricted = true)]
namespace MyNameSpace
{
using System;
using System.Security;
using System.Security.Permissions;
using System.IO;
public class MyClass
{
}
3为代码请求权限:
请求将应用到程序集范围,
代码通知运行库在此范围内运行它所需的权限或者具体不需要哪些权限。
运行库会在代码加载到内存中时计算安全请求。
请求不会使运行库给予代码的权限大于您不请求时运行库给予代码的权限。
但是,代码需要使用请求来通知运行库运行它所需的权限。
请求权限
请求权限是您让运行库知道需要允许代码执行哪些操作的方法。
通过将属性(声明式语法)放到代码的程序集范围内来为程序集请求权限。
创建程序集后,语言编译器将请求的权限存储在程序集清单中。
加载时,运行库检查权限请求,并应用安全策略规则来确定授予程序集哪些权限。
请求只会促使运行库拒绝将权限给予代码,而永远不会促使运行库将更多权限给予代码。
授予您的代码的最大权限最终总是由本地管理策略来控制。
在编写代码的时候 一定要设置 请求权限 ,例如对文件的读写最好封装成一个类,或者一个方法,
然后设置其权限为最小权限,需要的时候再开放其他权限
通过属性的方式,在编译的时候 或者用户运行的时候 会把这些权限封装到程序集清单中!
权限请求的类型:
最小权限 (RequestMinimum)
您的代码要运行必须拥有的权限。
可选的权限 (RequestOptional)
您的代码可以使用的权限,但在没有这些权限时代码仍可有效运行。
此请求隐式拒绝未明确请求的所有其他权限。
拒绝的权限 (RequestRefuse)
您要确保永远不授予您的代码的权限(即使安全策略允许将它们授予您的代码)。
4使用安全类库:
类库使用代码访问安全性来指定访问类库所需权限。
您应该知道访问您的代码所使用的任何库时所需的权限,并在代码中进行相应的请求。
5与权限有关的基础概念:
1代码组:Code Group
前面提到:我们可以利用代码访问安全设置什么样的代码可以访问数据库,什么样的代码不可以访问
我们把具有相似特性的一组代码分到一组
分组的最重要的特性:代码来自哪里,此外还包括代码来自的网站,代码的发布者,代码的强名
我们就是根据这些信息来把代码进行分组的 ,这些信息 我们给它一个术语:证据.
证据是用来为代码分组的
代码组的树状结构:
最上层:AllCode 其包含所有的代码组 例如包括(来自Internet的代码组)(来自局域网的代码组)
来自Internet的代码组 又可以分为:来自微软公司,信任列表的公司传过来的代码,
来自不认识的公司的网站代码等等.
2权限 : 我们为每一个代码组指定不一样的权限, 例如 来自微软的代码 给予完全自由的权限
而来自不认识的公司的网站代码只给予 只读权限
3程序集 代码组 权限 的关系:
每一个代码组 都被赋予相应的权限
程序集和一个或者多个代码组相匹配.所以 同一个程序集 对于不同的代码组会有不同的操作,有人就可以自由的访问
这个程序集,有的代码组就不可以访问
6NET中系统为我们定义好的代码访问权限
AspNetHostingPermission
访问 ASP.NET 所寄宿的环境中的资源。
DirectoryServicesPermission
访问 System.DirectoryServices 类。
DnsPermission
对域名系统 (DNS) 的访问权。
EnvironmentPermission
读取或写入环境变量。
EventLogPermission
对事件日志服务的读或写访问权。
FileDialogPermission
访问用户在"打开"对话框中选定的文件。
FileIOPermission
读取、追加或写入文件或目录。
IsolatedStorageFilePermission
访问独立存储,此存储是与特定用户关联和与代码标识的某方面(如其网站、出版商或签名)关联的存储。
MessageQueuePermission
通过托管 Microsoft 消息队列 (MSMQ) 接口访问消息队列。
OdbcPermission
访问 ODBC 数据源。
OleDbPermission
使用 OLE DB 访问数据库。
OraclePermission
访问 Oracle 数据库。
PerformanceCounterPermission
访问性能计数器。
PrintingPermission
访问打印机。
ReflectionPermission
查找某类型的运行时信息。
RegistryPermission
读取、写入、创建或删除注册表键和值。
SecurityPermission
执行、断言权限、调用到非托管代码中、跳过验证以及其他权限。
ServiceControllerPermission
访问正在运行的服务或已停止的服务。
SocketPermission
在传输地址上建立或接受连接。
SqlClientPermission
访问 SQL 数据库。
UIPermission
访问用户界面功能。
WebPermission
在 Web 地址上建立或接受连接。
7代码访问安全性 (CAS)
CAS 执行下列功能:
定义权限和权限集,它们表示访问各种系统资源的权限。
使管理员能够通过将权限集与代码组关联来配置安全策略。
使代码能够请求运行所必需的权限及其他一些有用的权限,并指定代码绝对不能拥有哪些权限。
根据代码要求的权限和安全策略允许的操作,向加载的每个程序集授予权限。
使代码能够要求其调用方拥有特定的权限。
使代码能够要求其调用方拥有数字签名,从而只允许特定组织或特定网站的调用方来调用受保护的代码。
通过将调用堆栈上为每个调用方授予的权限与调用方必须拥有的权限相比较,加强在运行时对代码的限制。
标识权限
标识权限表示标识程序集的特性。
公共语言运行库基于获取的有关程序集的信息,授予此程序集标识权限。
此信息(称为证据)由加载程序或受信任的宿主提供,
可包括程序集的数字签名或程序集源自的网站这样的项。
每种标识权限表示一类特定的证据,程序集必须拥有此类证据才能运行。
例如,某个权限表示程序集必须具有的强名称,而另一权限表示代码必须源自的网站,区域必须是中国的等等。
NET Framework 提供下列标识权限。
PublisherIdentityPermission
发行者的数字签名。
SiteIdentityPermission
代码源自的网站。
StrongNameIdentityPermission
程序集的强名称。
URLIdentityPermission
产生代码的 URL(包括协议前缀 http、https、ftp 等)。
ZoneIdentityPermission
代码源自的区域。
急于角色的权限
财务或商务应用程序中经常使用角色来强制策略。
例如,应用程序可能根据提出请求的用户是不是指定角色的成员,对要处理的事务大小加以限制。
职员有权处理的事务可能小于指定的阈值,主管拥有的权限可能比职员的高,
而副总裁的权限可能还更高(或根本不受限制)。
当应用程序需要多个批准完成某项操作时,也可以使用基于角色的安全性。
例如一个采购系统,在该系统中,任何雇员均可生成采购请求,
但只有采购代理人可以将此请求转换成可发送给供应商的采购订单。
.net中提供唯一一个类PrincipalPermission 类
。PrincipalPermission 类表示主体必须匹配的标识或角色,
利用这个类可以动态对代码中执行角色和标识编程,灵活实现会员功能
IPrincipal 接口
定义用户对象的基本功能。
用户对象表示用户的安全上下文,
代码当前即以该用户的名义运行,包括用户的标识(IIdentity)和它们所属的任何角色。
所有用户对象都需要实现 IPrincipal 接口。
基础概念:
标识对象
标识对象封装有关正在验证的用户或实体的信息。
在最基本的级别上,标识对象包含名称和身份验证类型。
名称可以是用户名或 Windows 帐户名,
而身份验证类型可以是所支持的登录协议(如 Kerberos V5)或自定义值。
.NET Framework 定义了一个 GenericIdentity 对象和一个更专用的 WindowsIdentity 对象,
前者可用于大多数自定义登录方案,后者可用于希望应用程序依赖 Windows 身份验证的情况。
此外,您还可以定义自己的标识类来封装自定义用户信息。
GenericIdentity 类 代表特定用户的标识对象,代码当前即以该用户的名义运行。
就是表示当前用户
它有三个属性:
AuthenticationType 获取用于标识用户的身份验证的类型。
IsAuthenticated 获取一个值,该值指示是否验证了用户。
Name 获取用户的名称。
用于验证用户,如果验证通过就给它开放某个会员功能
//定义一个用户标示类
GenericIdentity genericIdentity = new GenericIdentity("DefaultUser");
//获取其名字
string identityName = genericIdentity.Name;
//获取某个用户的验证方式
string identityAuthenticationType = genericIdentity.AuthenticationType;
//当某个用户要申请会员功能的时候 验证其是否是某会员角色,如果是验证通过
if (genericIdentity.IsAuthenticated)
{
Console.WriteLine("The user's identity has been authenticated.");
}
else
{
Console.WriteLine("The user's identity has not been " +
"authenticated.");
}
GenericPrincipal 类 表示当前用户的角色
//下面是动态为一个用户 赋予两种角色 黄钻 红钻 ,一个用户可以既是黄钻 又是红钻
//获取用户
GenericIdentity MyIdentity = new GenericIdentity("MyIdentity");
//角色名称,数组
String[] MyStringArray = {"Manager", "Teller"};
GenericPrincipal MyPrincipal = new GenericPrincipal(MyIdentity, MyStringArray);
//加入到线程中
Thread.CurrentPrincipal = MyPrincipal;
//回去一些信息
String Name = MyPrincipal.Identity.Name;
bool Auth = MyPrincipal.Identity.IsAuthenticated;
bool IsInRole = MyPrincipal.IsInRole("Manager");
网站安全设置
第一:VS中网站选项下ASP.NET配置的用法:
ASP.NET 的安全性建立在用户帐户、角色和访问规则这些概念的基础之上,
并可以限制只有指定的用户帐户才能访问 Web 应用程序的资源。
安全设置是通过结合使用配置设置与存储在数据库(或其他数据存储区)中的数据来建立的。
创建的用户帐户和角色存储在数据库中,而访问规则存储在 Web.config 文件中。
初次进入,一般需要设置身份验证类型,
身份验证类型:
1基于窗体的身份验证("通过 Internet")Forms 身份验证
基于窗体的身份验证用于可通过 Internet 访问的网站。
基于窗体的身份验证使用 ASP.NET 成员资格系统,以管理各个用户帐户和组(角色)。
用户帐户信息存储在本地数据库或 Microsoft SQL Server 数据库中。
可以使用 ASP.NET 登录控件来创建一个登录页,用户可以在该页上输入他们的凭据。
默认情况下,用户信息存储 Microsoft SQL Server Express 数据库中,
该数据库在网站的 Data 文件夹中。
选择身份验证,进入界面:
1创建用户帐户
单击"创建用户",然后指定下面的信息。
用户名输入要创建的用户帐户的名称。
密码 为"用户名"输入密码。密码是区分大小写的。
确认密码 再次输入"密码"。
电子邮件 为"用户名"输入电子邮件地址。
网站管理工具不会确认输入的地址是否为有效的电子邮件地址,但是会验证该电子邮件地址是否符合电子邮件地址的正确格式。
安全提示问题 输入当用户需要重置或恢复密码时向用户询问的问题。
安全答案 输入"安全提示问题"的答案。
活动用户 选择此选项,以启用此用户帐户作为站点的活动(当前)用户。如果不选择此选项,则用户信息将存储在数据库中,但用户无法登录网站。
2角色
选择"用户名"的角色。
创建角色
在"安全"选项卡上,单击"启用角色"。
单击"创建或管理角色"。
在"新角色名称"框中,输入要创建的角色的名称,例如"Administrator"、"Member"或"Guest",然后单击"添加角色"。
向角色添加用户帐户
在"安全"选项卡上,单击"管理用户",再单击"编辑用户"。
在"角色"下选择用户帐户的角色。
3创建访问规则
在"安全"选项卡上,单击"创建访问规则"。
指定下面的选项:
为此规则选择一个目录
可以选择创建一条规则,该规则既可以应用于整个站点,也可以只应用于特定的子目录。在显示的网站目录结构中,选择该规则要应用的目录。
在"规则应用于"下,指定如何应用规则。
角色
选择"角色",然后在列表中选择要应用访问规则的角色的名称。
用户
选择"用户",然后输入要应用访问规则的用户帐户的名称。如果使用 ASP.NET 成员资格(网站安全性设置为"通过 Internet"),则还可以使用"搜索用户"功能。
所有用户
选择此选项以将规则应用于网站的所有访问者。
注意:
用"所有用户"选项创建规则时一定要小心。
因为规则按顺序应用,所以可能会无意创建一条使所有用户均无法访问某个文件夹的规则。
匿名用户
选择此选项以将此规则只应用于匿名(非注册)用户帐户。
通常,可选择"匿名用户"选项以限制(拒绝)未登录用户的访问。
权限
选择"允许",以允许指定的用户帐户或角色对指定目录的访问。
选择"拒绝",以拒绝指定的用户帐户或角色对指定目录的访问。
例如,若要防止未登录(匿名)用户查看一个文件夹中的页,请单击该文件夹,选择"匿名用户",再选择"拒绝"。
有时,可能需要为同一个文件夹创建多条规则,以便建立正确的权限。例如,可能会创建一条规则,该规则拒绝对匿名用户帐户的访问,同时创建第二条规则,该规则拒绝对 Guest 角色中的用户帐户的访问。那样,只有其他组中的已登录用户才能访问该文件夹。
幕后(我们所有的设置都会自动把信息保存到web.config中)
Web.config 设置
通过"安全"选项卡管理的 Web.config 设置为
<authorization>、<roleManager> 和 <authentication> 节。
下面的代码示例是一个 Web.config 文件,该文件用网站管理工具在网站的一个受限制子目录中创建。管理员能够访问该受限制的子目录,而匿名用户不能访问。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<authorization>
<allow roles="administrators" />
<deny users="?" />
</authorization>
</system.web>
</configuration>
"提供程序"选项卡
将用户名 角色名存储在数据库中的方法:
在命令行中输入:
aspnet_regsql.exe (会自动打开一个图形界面,设置要存储的数据库名称)
使用默认数据提供程序时,网站管理工具在默认的 ASP.NET 数据库中创建项。
在默认情况下,网站管理工具在网站的 App_Data 文件夹中创建数据库。
但是,通过使用"提供程序"选项卡,可以指定将用户帐户和角色的应用程序信息保存在另一个数据库中(例如,从 Windows 用户数据库检索角色信息)
幕后
"提供程序"选项卡管理一些配置设置,这些设置存储在应用程序的 Web.config 文件中。具体来说,通过"提供程序"选项卡管理的设置存在于配置文件的
<membership> 和 <roleManager> 节中。
下面的代码是在指定将 AspNetWindowsTokenRoleProvider 提供程序用于角色管理后,由网站管理工具生成的 Web.config 文件。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<membership defaultProvider="AspNetSqlMembershipProvider" />
<roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider" />
<authentication mode="Forms" />
</system.web>
</configuration>
网站管理工具的"应用程序"选项卡:
管理与 Web 应用程序和站点相关的常用设置
大的方向包括:
1简单邮件传输协议 (SMTP) 设置。
如果网站需要发送电子邮件的功能(例如,向用户发送密码),则必须指定站点使用的 SMTP 服务器。
2应用程序状态。
可以使您的应用程序脱机(将其关闭)以执行维护,或使一个新的 Microsoft SQL Server 速成版的数据库联机。
3调试和跟踪。
调试和跟踪使您能够诊断并修复 Web 应用程序的问题,主要是为了在开发中使用。
启用调试将导致网站中的页在编译时带入一些信息,.NET Framework 或 Microsoft Visual Studio 调试器可以使用这些信息,以逐句通过代码。
启用跟踪将导致页生成一些信息,这些信息包括单个 Web 请求、与请求一起发送的 HTTP 标头、页上控件的状态和其他有关页处理的详细信息。
具体做法:
必须在 Web 应用程序运行的计算机上拥有管理凭据,才可以更改此应用程序的调试和跟踪设置。
1启用调试 选择此选项,以启用对网站中所有页的调试。
捕获跟踪信息
选择此选项,以启用对网站中所有页的跟踪。如果选择此复选框,则会启用页上剩余的选项。
如果设置了捕获跟踪信息的选项,则可以选择:
在各个页上显示跟踪信息
选择此选项,以将跟踪信息附加在站点上网页的底部。如果不显示单个页的跟踪信息,该信息还是会被捕获。若要查看跟踪信息,可以请求网站的 Trace.axd 页,该页用作跟踪信息查看器。
仅本地请求
选择此选项以查看只来自主机 Web 服务器 (localhost) 的请求的跟踪信息。
所有请求
选择此选项以查看来自任何计算机的跟踪信息。
在"选择跟踪结果的排序顺序"下,指定要如何显示跟踪信息,如下:
按时间 选择此选项以按照捕获的顺序来显示跟踪信息。
按类别 选择此选项,以在用户定义的类别中按字母顺序显示跟踪信息。
要缓存的跟踪请求数 输入在服务器上存储的跟踪请求的数目。可以通过使用跟踪查看器(http://服务器/应用程序/trace.axd)来查看缓存的信息。默认值为 10。如果不选择"最新跟踪结果"选项,而且到达了限制,则跟踪会自动被禁用。
在"选择要缓存的跟踪结果"下,指定要如何显示跟踪输出,如下:
最新跟踪结果
选择此选项以显示最新的跟踪输出,并放弃超出由"要缓存的跟踪请求数"指示的限制的较旧跟踪数据。
最早的跟踪结果
选择此选项以显示请求的跟踪数据,直至达到"要缓存的跟踪请求数"为止。
注意;
启用某个页面的跟踪功能后,跟踪信息可能出现在向服务器中的该页发出请求的任何浏览器上。
由于跟踪会透漏一些敏感信息,如服务器变量的值,因此可认为是一种安全威胁。
在将 Web 应用程序发布到成品服务器之前,请确保禁用该页的页跟踪。
32定义默认错误页
(可以实现对整个网站设置异常处理)
超级重要
这是一个非常重要的知识:可以为整个网站建立异常处理,如果出现错误都会访问这个页面
超级重要
若要配置网站的自定义错误页,请单击"定义默认错误页",然后指定:
使用默认错误信息
选择此选项以使用默认的错误页。
指定要用作默认错误页的 URL
选择此选项以使用自定义错误页,然后选择要使用的页。
也可以在web.config中设置
<configuration>
<system.Web>
<customErrors defaultRedirect="~/myErrorPage.aspx" />
<trace enabled="True" pageOutput="True" localOnly="True"
traceMode="SortByCategory"
requestLimit="10" mostRecent="True" />
<compilation debug="True" />
</system.Web>
</configuration>
4使应用程序脱机和联机
如果需要在网站上执行维护,则可以使网站脱机。
这将关闭正在运行网站的进程,因而使站点不再提供页。
然后,可以对页或其他文件进行编辑,并避免了在编辑的过程中页被请求,而这可能会导致错误。
如果使用 SQL Server 标准版,并需要向应用程序交换或添加 .mdf 数据库文件,则使应用程序脱机也是非常有用的。
如果应用程序正在运行,则无法附加到新的 .mdf 文件。
当完成了编辑文件或添加或更改 .mdf 文件时,可以使应用程序重新联机。
脱机设置存在于网站的 Web.config 文件的 <httpRuntime> 节中。
在使用网站管理工具使应用程序脱机后,生成下面代码中的突出显示的行。
<configuration>
<system.Web>
<httpRuntime enable="False" />
</system.Web>
</configuration>
只要 httpRuntime 设置是禁用的,ASP.NET 在接收请求时,就不会为应用程序创建 AppDomain 对象。
实际上,Web 应用程序将无法启动。
修改完之后,就可以再把其值设置为true,别人就可以访问这个网页了
5应用程序设置:
就相当于Application的功能
AppSettings 中的内容可以实现被整个网页看见:
要想在所有的页面使用一个标题,可以使用 ConfigurationSettings 类的 AppSettings 属性
labelPageHeading.Text = ConfigurationManager.AppSettings["AppName"];
<configuration>
<appSettings>
<add key="ApplicationName" value="MyApplication" />
</appSettings>
</configuration>
2集成 Microsoft Windows 身份验证("通过本地网络")
Windows 身份验证使用用户在登录到 Windows 时提供的登录凭据,与 Windows 安全性交互。
因此,Windows 身份验证适用于 Intranet 方案,即用户登录到基于 Windows 的网络的方案。
您不必创建登录页,因为用户可使用 Windows 凭据自动登录到您的应用程序。
首先在首页面选择 Windows验证然后
第二:网站管理第二个工具
ASP.NET 配置 API
就是NET中提供的操纵web.config的类
简介:
ASP.NET 配置 API 允许您通过使用单个编程接口来开发、部署和管理应用程序的配置数据。
通过使用配置 API,可以以编程方式开发和修改完整的 ASP.NET 配置,而无需直接编辑配置文件中的 XML。
另外,在开发的控制台应用程序和脚本、基于 Web 的管理工具和 MMC 管理单元中可以使用配置 API。
1本地:
ASP.NET MMC 管理单元,此管理单元使用配置 API 简化管理任务,并为配置层次结构中所有级别的本地配置数据提供一个集成视图。
2远程:
网站管理工具,使用此工具,可以管理本地和远程应用程序(包括承载的站点)的配置设置。
作用:
1动态操纵配置文件,可以实现手动写的所有功能
2生成专用的工具
您可能需要允许许多管理员来管理所分配的资源,如特定的网站和应用程序,但同时限制这些管理员可对其他资源执行的操作。您可以开发使用 ASP.NET 配置 API 的管理工具,以便只公开管理员执行其工作所必需的配置设置,同时拒绝对其他设置的访问。这样就避免了直接访问配置文件,从而赋予了管理员一定的权限并有助于保护资源。
3面向多台服务器的工具
如果您管理多台服务器,则可能需要在每一台服务器上部署和管理相同的 ASP.NET 应用程序。
例如,要管理网络场,可能需要执行下列任务:
编写一个脚本,以便在网络场中的任何服务器或所有服务器上配置同一个 ASP.NET 应用程序。
锁定用于每个应用程序实例的某些文件。
自动执行审核,以便记录所部署应用程序的配置,从而确保以相同的方式配置每一台计算机上的安装。
配置中编辑一次更改,然后将该更改应用于应用程序的所有实例(无论这些实例安装在哪里)。
另外,ASP.NET 配置 API 还支持跨多台服务器的成批执行。
总体介绍:
1Configuration 对象(最大)
表示应用于特定物理实体(如计算机)或逻辑实体(如应用程序或网站)的配置设置的合并视图。指定的逻辑实体可以存在于本地计算机或远程服务器上。
如果指定实体没有对应的配置文件,则 Configuration 对象将表示 Machine.config 文件定义的默认配置设置。
2获取获取 Configuration 对象:
ConfigurationManager 类(如果实体是客户端应用程序)。
WebConfigurationManager 类(如果实体是 Web 应用程序)。
这些方法将返回 Configuration 对象
3读取
使用 GetSection 或 GetSectionGroup 方法读取配置信息。
进行读取的用户或进程必须对层次结构中的所有配置文件具有读取权限。
4写入
使用 Save 方法之一写入配置信息。
进行写入的用户或进程必须对配置层次结构中当前级别的配置文件和目录具有写入权限,
而且还必须对该层次结构中的所有配置文件具有读取权限。
ASP.NET MMC 管理单元介绍:
ASP.NET MMC 管理单元在计算机上创建和管理 ASP.NET 应用程序的配置。
ASP.NET MMC 管理单元通过图形用户界面公开 ASP.NET 配置 API 的功能。
ASP.NET MMC 管理单元为来自多个配置文件的配置设置(如会话、安全、错误和跟踪)提供统一的视图。
您可以更改这些设置,而无需直接在配置文件中编辑 XML。
常用功能:
1代开全局配置文件 Machine.config
System.Configuration.Configuration machineConfig =
System.Web.Configuration.WebConfigurationManager.OpenMachineConfiguration();
machineConfig.SaveAs("c:\\machineConfig.xml");
2打开Web.config
System.Configuration.Configuration webConfig =
System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration("/Temp");
webConfig.SaveAs("c:\\webConfig.xml");
3以编程方式访问 ASP.NET 配置设置
下面的代码示例读取针对 MyAppRoot 应用程序配置的 identity 元素的 impersonate 属性值。该值显示在网页上。
该代码使用 IdentitySection 对象类型读取 identity 节中的数据。
若要更改配置设置,请使用配置对象的 Save 或 SaveAs 方法
//打开指定的配置文件
string configPath = "/MyAppRoot";
Configurationconfig=WebConfigurationManager.OpenWebConfiguration(configPath);
//获取指定的节点
IdentitySection
section =(IdentitySection)config.GetSection("system.web/identity");
//获取之后再读取
StringBuilder identity = new StringBuilder();
identity.Append("Impersonate: ");
identity.Append(section.Impersonate.ToString());
// Display the <identity> information.
TextBox1.Text = identity.ToString();
4如何:从 Web.config 文件读取应用程序设置
此示例从 Web.config 文件读取由 customsetting1 密钥标识的应用程序设置
。appSettings 元素是字符串的 NameValueCollection 集合。
使用集合元素可能会比使用其他配置元素稍微复杂一些。
若要获取根级别的 Web 配置的配置设置,应向 OpenWebConfiguration 方法传递 null。
若要更新配置设置,请使用配置对象的 Save 或 SaveAs 方法
<appSettings>
<add key="customsetting1" value="Some text here"/>
</appSettings>
System.Configuration.Configuration rootWebConfig1 =
System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(null);
if (0 < rootWebConfig1.AppSettings.Settings.Count)
{
System.Configuration.KeyValueConfigurationElement customSetting =
rootWebConfig1.AppSettings.Settings["customsetting1"];
if (null != customSetting)
Console.WriteLine("customsetting1 application string = \"{0}\"",
customSetting.Value);
else
Console.WriteLine("No customsetting1 application string");
}
远程操纵配置文件
若要启用对远程计算机上的配置设置的访问,请使用 Aspnet_regiis 命令行工具。
安全性理论:
1威胁建模
您只有了解系统可能会受到的所有攻击,才能使系统免受这些攻击。
评估安全威胁的过程称为"威胁建模",该过程是确定 ADO.NET 应用程序中违反安全性的可能性及后果所必要的。
威胁建模由三个高级步骤组成: 了解攻击者的目的、辨别系统安全性和确定威胁。
威胁建模是一种迭代方法,用于评估应用程序中的漏洞,以找到可公开敏感数据的最危险的漏洞。
一旦确定了漏洞,您就可以按安全性对其进行排列,并创建一组按优先顺序排列的措施以应对威胁。
2最小特权原则
指出,应在完成工作所需的最短时间内向所需的最少代码授予任何给定的特权。
创建安全应用程序的最好方法是在开始阶段不授予任何权限,
然后对执行的特定任务添加最有限的权限。
相反,如果开始具有所有权限而以后拒绝个别权限,就会导致难以测试和维护的不安全应用程序,
因为无意中授予过多的权限会造成完全漏洞。
3开发c#应注意的一些安全性:
1使用 checked 关键字控制整型算术运算和转换的溢出检查上下文。
2始终对参数使用最严格的数据类型。
例如,在将值传递给一个描述数据结构大小的方法时,应使用无符号整数而不是整数。
3不要基于文件名做出判断。
文件名的表示方法可以有很多种,因此攻击者可能避开您对特定文件设置的测试。
4千万不要将密码或其他敏感信息硬编码到应用程序中。
5始终验证用于生成 SQL 查询的输入。
6验证传入方法的所有输入。System.Text.RegularExpressions 命名空间中的正则表达式方法可用于确认输入是否具有正确的格式(如电子邮件地址)。
7不要显示异常信息:它会给任何潜在的攻击者提供有价值的线索。
8确保应用程序在最低可能权限下运行时能够正常工作。很少有应用程序要求用户以管理员的身份登录。
9不要使用自己的加密算法。应该使用 System.Security.Cryptography 类。
10为程序集指定强名称。
11不要在 XML 或其他配置文件中存储敏感信息。
12仔细检查包装本机代码的托管代码。确认本机代码是安全的。
13在使用从应用程序外部传递的委托时应十分谨慎。
14对程序集运行 Visual Studio 代码分析工具,以确保符合 Microsoft .NET Framework 设计准则。此工具还可以找到 200 个以上的代码缺陷并提出警告。有关更多信息,请参见检测和更正托管代码缺陷。
保证 ADO.NET 应用程序的安全
注入式攻击:
就是在代码中使用了查询语句,或者在连接字节字符串中提供了一些信息,
别人会在你的查询语句中注入其他语句破坏我们想实现的查询,或者对我们的数据进行恶意修改,从而访问一些敏感数据
当动态字符串串联根据用户输入的内容构建连接字符串时,
会发生连接字符串注入攻击。 如果用户输入的内容未经验证,
并且恶意文本或字符串未被转义,则攻击者可能会访问敏感数据或服务器上的其他资源。
第一:应用最小原则:
最小特权原则也适用于数据源。 数据库安全性一般准则包括:
使用最低可能的特权创建帐户。
不允许用户访问管理帐户,只允许运行代码。
不要将服务器端错误消息返回到客户端应用程序。(可以定义错误后出现的页面,不要把异常信息透漏给客户)
验证客户端和服务器端的所有输入。
使用参数化命令,避免动态 SQL 语句。(多用存储过程,可以封装语句,因为,使用存储过程就用一个名字,让人看不出具体内容,从而保证安全)
为您使用的数据库启用安全审核和记录,以便违反任何安全性时得到警报。
第二:将数据存储在数据集内
数据集的优越性有:
1 一个数据集可以包含多个结果表,它将这些表作为离散对象维护。
您可以单独使用这些表或作为父子表在它们之间导航。
2操作来自多个源的数据
数据集内的表可表示来自多个不同源的数据,
例如来自不同数据库、XML 文件、电子表格等的数据,都可出现在同一个数据集中。
数据在数据集内以后,您可以操作数据并以同种格式关联数据,就好像它们来自单个源。
3在分布式应用程序中的层间移动数据
通过在数据集内保存数据,您可以方便地将它在应用程序的表示层、业务层和数据层之间移动。
4与其他应用程序进行数据交换
数据集提供一种功能强大的数据交换方式,它可以与您的应用程序的其他组件以及其他应用程序交换数据。
数据集包含对许多功能的广泛支持,如将数据序列化为 XML 和读写 XML 架构。
5数据绑定 如果正在使用窗体,将控件绑定到数据集内的数据通常比执行命令后以编程方式将数据值加载到控件方便。
6维护记录以供重复使用
通过数据集,您无需再次查询数据库即可重复使用相同的记录。
使用数据集功能,您可以对记录进行筛选和排序,并且可以将数据集用作数据源(如果您正在分页)。
7便于编程
当使用数据集时,可以生成一个将其结构表示为对象的类文件
(例如,数据集内的 Customers 表可以作为 dataset.Customers 对象访问)。
这使得用它编程更容易、更清楚也更不易出错,并且受到 Intellisense、"数据适配器配置向导"等 Visual Studio 工具的支持。
第三:连接到 Microsoft SQL Server 后,您便可以使用 Windows 身份验证(也称为集成安全),
它使用当前活动 Windows 用户的标识,而不是传递用户 ID 和密码。
由于不会在连接字符串中公开用户凭据,因此强烈建议使用 Windows 身份验证。
第四 使用SqlConnectionStringBuilder 类
可以管理连接字符串,动态操作连接字符串
SqlConnectionStringBuilder 对有效的键/值对执行检查。
因此,不能使用此类来创建无效的连接字符串;
尝试添加无效的键/值对将引发异常
System.Data.SqlClient.SqlConnectionStringBuilder builder =
new System.Data.SqlClient.SqlConnectionStringBuilder();
builder["Data Source"] = "(local)";
builder["integrated Security"] = true;
builder["Initial Catalog"] = "AdventureWorks;NewValue=Bad";
Console.WriteLine(builder.ConnectionString);
第五:将连接字符串存储在配置文件中使用受保护配置加密配置文件节
ASP.NET 2.0 提供了一个称为"受保护配置"的新功能,
您可以通过此功能来加密配置文件中的敏感信息。
虽然受保护配置主要是为 ASP.NET 应用程序设计的,
但它也可以用于加密 Windows 应用程序中的配置文件节。
方法:
1自定义加密方法:
通过ProtectedConfigurationProvider抽象 类
可以对配置文件的节进行加密,以保护应用程序所使用的敏感信息。
这样,即使攻击者获得了对配置文件的访问权限,也很难对配置文件进行未授权访问,
从而提高了安全性。
ProtectedConfigurationProvider 抽象类继承 System.Configuration.Provider 命令空间的 ProviderBase 抽象类,
因此还必须实现 ProviderBase 类必需的成员。
必需的 ProviderBase 成员
Initialize 方法
为提供程序实例设置属性值,包括在应用程序配置中提供的实现特定的值和选项。
接受提供程序的名称和配置设置的 NameValueCollection 作为输入。
必需的 ProtectedConfigurationProvider 成员
Encrypt 方法
执行加密。接受包含要加密的配置节的 XmlNode 对象作为输入。
例如,如果要加密的配置节是 connectionStrings 节,
则 XmlNode 对象表示类似于下面的示例的 XML 数据。
<connectionStrings>
<add name="SampleConnectionString"
connectionString="Data Source=localhost;Initial Catalog=Northwind;Integrated Security=SSPI;" />
</connectionStrings>
Encrypt 方法对 XmlNode 对象的 OuterXml 值进行加密,
并返回 EncryptedData 元素是根元素的 XmlNode 对象,如下面的示例所示:
<EncryptedData>
<!-- encrypted contents -->
</EncryptedData>
EncryptedData 元素的内容格式由实现功能确定。在对该元素进行解密时,ASP.NET 会将 XmlNode 对象传递到 Decrypt 方法,其中 EncryptedData 元素是根元素。
Decrypt 方法
执行解密。
接受包含加密配置节的 EncryptedData 元素的 XmlNode 对象作为输入。
例如,如果 connectionStrings 节是已加密的配置节,则 XmlNode 对象所表示的 XML 数据类似于下面的示例中突出显示的 XML。
<connectionStrings configProtectionProvider="CustomProvider">
<EncryptedData>
<!-- encrypted contents -->
</EncryptedData>
</connectionStrings>
Decrypt 方法对 XmlNode 对象的内容进行解密,并返回一个 XmlNode 对象,该对象表示 EncryptedDataXmlNode 对象的已解密内容。
例如,如果 connectionStrings 节已进行加密,则 Decrypt 返回一个 XmlNode 对象,该对象包含类似于下面的示例的 XML 数据。
<connectionStrings>
<add name="SampleConnectionString"
connectionString="Data Source=localhost;Initial Catalog=Northwind;Integrated Security=SSPI;" />
</connectionStrings>
2使用工具
1创建和存储加密密钥
就是用已经做好的程序生成一个序列,放在txt文件中
这个十六进制字符串加密密钥对配置节进行加密和解密。
创建的方法是固定的:
第一步:创建名为 CreateKey 的控制台应用程序。
复制下面的代码当作应用程序的主模块。
using System;
using Samples.AspNet.ProtectedConfiguration;
public class CreateKey
{
public static void Main(string[] args)
{
string filePath = args[0];
TripleDESProtectedConfigurationProvider provider =
new TripleDESProtectedConfigurationProvider();
provider.CreateKey(filePath);
Console.WriteLine("New TripleDES Key written to '{0}'", filePath);
}
}
该示例受保护配置提供程序中包括一个公共 CreateKey 方法,该方法将文件路径作为输入,
并生成新的密钥,然后将新密钥写入指定的文件。
控制台应用程序中的代码创建一个受保护配置提供程序的实例并调用它的 CreateKey 方法。
该代码将文件路径当作命令行参数,然后在指定位置创建新的密钥文件。
在 Windows 命令行下,使用类似下面的语法运行控制台应用程序:
CreateKey "c:\WebSites\SampleApplication\App_Data\Keys.txt"
在Web.config中添加上面创建的密钥的位置以及其他控制解密信息:
<configuration>
<configProtectedData>
<providers>
<add name="TripleDESProvider"
type="Samples.AspNet.ProtectedConfiguration.TripleDESProtectedConfigurationProvider,
TripleDESProtectedConfigurationProvider,
Version=0.0.0.0, CultureInfo=neutral,
PublicKeyToken=a5a9eb4fc5306403,
processorArchitecture=MSIL"
keyFilePath="c:\WebSites\SampleApplication\App_Data\Keys.txt" />
</providers>
</configProtectedData>
</configuration>
3
在 Windows 命令行下,运行下面的命令对 Web.config 文件的 connectionStrings 节进行加密:
aspnet_regiis.exe -pe "connectionStrings" -app "/SampleApplication" -prov "TripleDESProvider
第三种方法:
利用计算机级别的 RSA 密钥容器
计算机级别的 RSA 密钥容器和用户级别的 RSA 密钥容器的区别:
用户级别的 RSA 密钥容器存储在特定用户的 Windows 用户配置文件中,
并且可以用于加密和解密在该特定用户标识下运行的应用程序的信息。
如果希望确保在移除 Windows 用户配置文件时同时移除 RSA 密钥信息,
则用户级别的 RSA 密钥容器非常有用。
但是,由于登录时必须使用特定的用户帐户(该帐户将利用用户级别的 RSA 密钥容器来加密或解密受保护的配置节),
因此它们使用起来不太方便。
默认情况下,计算机级别的 RSA 密钥容器对于所有可以登录到计算机的用户都可用,
而且由于使用管理员帐户登录时可以使用这些密钥容器加密或解密受保护的配置节,
因此它们是最有用的。计算机级别的 RSA 密钥容器可以用于为单个应用程序、
一台服务器上的所有应用程序或者服务器上在同一用户标识下运行的一组应用程序提供信息保护。
计算机级别的 RSA 密钥容器对所有用户都可用,
不过也可以使用 NTFS 访问控制列表 (ACL) 保护这些密钥容器,以便只有所需的用户才能访问它们。
当使用 Aspnet_regiis.exe 工具创建、导出、导入或删除 RSA 密钥容器时,
必须指定该 RSA 密钥容器属于计算机级别还是用户级别。
可使用 -pku 选项将 RSA 密钥容器标识为用户级别的密钥容器;
否则,该 RSA 密钥容器将被视为计算机级别的容器。
由于使用用户级别的 RSA 密钥容器没有什么益处,
因此建议在使用 RSAProtectedConfigurationProvider 提供程序保护配置节时,应使用计算机级别的 RSA 密钥容器。
1创建自定义的 RSA 密钥容器
第一步:
打开命令提示。运行 aspnet_regiis.exe 来创建计算机级别的新 RSA 密钥容器:
-pc 选项后跟 RSA 密钥容器的名称,用于创建 RSA 密钥对。
-exp 选项,用于确保密钥是可导出的。
下面的命令将创建 "MyKeys" 密钥容器。
aspnet_regiis -pc "MyKeys" -exp
请勿关闭"命令提示"窗口。(千万不要关闭,不然就不管用了)
指定受保护的配置提供程序
若要指定"受保护配置"提供程序的实例
打开文本编辑器,然后打开 ASP.NET 应用程序的 Web.config 文件。
确保该配置包括 <connectionStrings> 元素,如下面的示例所示。
<configuration>
<connectionStrings>
<add name="SqlServices" connectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;" />
</connectionStrings>
</configuration>
添加 <configProtectedData> 节,
其中包括名为 "MyProvider" 的 RsaProtectedConfigurationProvider 类的实例,
这个类使用名为 "MyKeys", 的计算机级别 RSA 密钥容器,如下面的示例所示。
复制代码
<configuration>
<configProtectedData>
<providers>
<add name="MyProvider"
type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0. 0.0,
Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a,
processorArchitecture=MSIL"
keyContainerName="MyKeys"
useMachineContainer="true" />
</providers>
</configProtectedData>
<connectionStrings>
<add name="SqlServices" connectionString="Data Source=localhost;Integrated Security=SSPI;Initial Catalog=Northwind;" />
</connectionStrings>
</configuration>
保存并关闭 Web.config 文件。
第三步:
对 Web.config 文件的 <connectionStrings> 节进行加密
在命令提示处,运行带有下列选项的 aspnet_regiis.exe:
-pe 选项,后跟 "connectionStrings",用于对应用程序的 Web.config 文件的 <connectionStrings> 元素进行加密。
-app 选项,用于标识应用程序的名称。
-prov 选项后跟 "MyProvider",用于标识在上述步骤中 Web.config 文件中指定的 RsaProtectedConfigurationProvider 提供程序。
例如,下面的命令将加密 MyApplication 应用程序的 Web.config 文件的 <connectionStrings> 节。
aspnet_regiis -pe "connectionStrings" -app "/MyApplication" -prov "MyProvider"
打开 Web.config 文件并查看已加密的内容。
内容与下面的示例 Web.config 文件类似。
复制代码
<configuration>
<configProtectedData>
<providers>
<add name="MyProvider"
type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0. 0.0,
Culture=neutral, PublicKeyToken= b03f5f7f11d50a3a,
processorArchitecture=MSIL"
keyContainerName="MyKeys"
useMachineContainer="true" />
</providers>
</configProtectedData>
<connectionStrings configProtectionProvider="MyProvider">
<EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<KeyName>RSA Key
</KeyName>
</KeyInfo>
<CipherData>
<CipherValue>WcFEbDX8VyLfAsVK8g6hZVAG1674ZFc1kWH0BoazgOwdBfinhcAmQmnIn0oHtZ5tO2EXGl+dyh10giEmO9NemH4YZk+iMIln+ItcEay9CGWMXSen9UQLpcQHQqMJErZiPK4qPZaRWwqckLqriCl9X8x9OE7jKIsO2Ibapwj+1Jo=
</CipherValue>
</CipherData>
</EncryptedKey>
</KeyInfo>
<CipherData>
<CipherValue>OpWQgQbq2wBZEGYAeV8WF82yz6q5WNFIj3rcuQ8gT0MP97aO9SHIZWwNggSEi2Ywi4oMaHX9p0NaJXG76aoMR9L/WasAxEwzQz3fexFgFSrGPful/5txSPTAGcqUb1PEBVlB9CA71UXIGVCPTiwF7zYDu8sSHhWa0fNXqVHHdLQYy1DfhXS3cO61vW5e/KYmKOGA4mjqT0VZaXgb9tVeGBDhjPh5ZlrLMNfYSozeJ+m2Lsm7hnF6VvFm3fFMXa6+h0JTHeCXBdmzg/vQb0u3oejSGzB4ly+V9O0T4Yxkwn9KVDW58PHOeRT2//3iZfJfWV2NZ4e6vj4Byjf81o3JVNgRjmm9hr9blVbbT3Q8/j5zJ+TElCn6zPHvnuB70iG2KPJXqAj2GBzBk6cHq+WNebOQNWIb7dTPumuZK0yW1XDZ5gkfBuqgn8hmosTE7mCvieP9rgATf6qgLgdA6zYyVV6WDjo1qbCV807lczxa3bF5KzKaVUSq5FS1SpdZKAE6/kkr0Ps++CE=
</CipherValue>
</CipherData>
</EncryptedData>
</connectionStrings>
</configuration>
关闭 Web.config 文件。
注意:
ASP.NET 在处理 Web.config 文件时会自动对该文件的内容进行解密。
因此,不需要任何步骤即可对已加密的配置设置进行解密,
供其他 ASP.NET 功能使用或用于访问代码中的值。
RSA 密钥容器的其他一些操作:
导出 RSA 密钥容器
例如,下面的命令将名为 SampleKeys 的计算机级 RSA 密钥容器导出到名为 keys.xml 的文件中并包括了私钥信息。
aspnet_regiis -px "SampleKeys" keys.xml -pri
注意:
出于安全原因,在将 RSA 密钥容器导出到某个 XML 文件之后,
请将该 XML 文件复制到服务器外部的一个位置并将该 XML 文件从服务器中删除。
这样能够减少攻击者访问到您的 RSA 密钥容器的机会,
因而可降低攻击者对使用该 RSA 密钥容器加密的 Web.config 文件进行解密的能力。
导入 RSA 密钥容器
例如,下面的命令从名为 keys.xml 的文件中导入名为 SampleKeys 的计算机级 RSA 密钥容器:
aspnet_regiis -pi "SampleKeys" keys.xml
删除 RSA 密钥容器
例如,下面的命令删除名为 SampleKeys 的计算机级 RSA 密钥容器。
aspnet_regiis -pz "SampleKeys"
第四利用 使用配置类进行加密:
(重点)
//打开web.config文件
//提供一个web.config的名字
Configuration config = ConfigurationManager.OpenExeConfiguration(exeConfigName);
//获取我们要加密的节点
ConnectionStringsSection section =config.GetSection("connectionStrings") as ConnectionStringsSection;
// 加密
section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
//保存
config.Save();
还可以通过使用波形符来提供 Web.config 文件的相对路径。
Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
ConnectionStringsSection section =config.GetSection("connectionStrings") as ConnectionStringsSection;
section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
config.Save();
类型安全与代码验证
类型安全代码只访问被授权可以访问的内存位置。
在实时 (JIT) 编译期间,
可选的验证过程检查要实时编译为本机代码的方法的元数据和 Microsoft 中间语言 (MSIL),
以验证它们是否为类型安全
类型安全帮助将对象彼此隔离,因而可以保护它们免遭无意或恶意的破坏。
它还提供了对代码可以可靠地强制安全限制的保证。