第十七讲 ASP.NET安全性
*摘要
。输入安全性
。身份验证
。按权
。ASP.NET模拟
。存储机密
。使用加密
。ASP.NET安全使用最佳实践
*输入验证
。验证所有的输入
-使用ASP.NET验证控件
-对于其他情况,使用正则表达式(e.g.,Web Service 参数)
。对于输出的数据要加密
。使用参数化的存储过程和查询语句
*身份验证
。身份验证是指以下过程:获取标识凭据(如用户名和密码),并对照某一颁发机构来验证这些凭据。
。ASP.NET提供了四个身份验证提供程序:
-表单身份验证
-Windows身份验证
-Passport身份验证
-默认身份验证
*表单身份验证
表单身份验证是指以下系统:将末经身份验证的请求重定向到一个超文本标记语言(HTML)表单,使用户能够在其中键入他们的凭据。在
用户提供凭据并提交该表单后,应用程序对请求进行身份验证,然后系统以Cookie的形式发生身份验证票证。此Cookie包含凭据或用于重
新获取标识的密钥。浏览器的后续请求自动包含此Cookie。
*Windows身份验证
在Windows身份验证中,IIS执行身份验证,并将经过身份验证的标记传递给ASP.NET工作进程。使用Windows身份验证的优点是它需要的编
码最少。在将请求传递给ASP.NET之前,您可能需要使用Windows身份验证来模拟IIS进行验证的Windows用户账户。
*Passport身份验证
Passport身份验证是Microsoft提供的集中式身份验证服务,它为成员站点提供单一登录和核心配置文件服务。通常,当您需要跨越多个
域的单一登录功能时,将使用Passport身份验证。
*默认身份验证
当Web应用程序不需要任何安全功能时,将使用默认身份验证:此安全提供程序需要匿名访问。在所有的身份验证提供程序中,默认身份
验证为应用程序提供了最高的性能。当您使用自己的自定义安全模块时,也可以使用此身份验证提供程序。
*表单身份验证的开发步骤
1、将IIS配置为使用匿名访问。
2、将ASP.NET配置为使用表单身份验证。
3、创建登录Web表单并验证提供的凭据。
4、从自定义数据存储中检索角色列表。
5、创建表单身份验证票(在票中存储角色)。
6、创建一个IPrincipal对象。
7、将IPrincipal对象放到当前的HTTP上下文中。
8、基于用户名/角色成员身份对用户进行授权。
*授权
。授权是指验证经身份验证的用户是否可以访问请求资源的过程。
。ASP.NET提供以下授权提供程序:
-FileAuthorization:FileAuthorizationModule类进行文件授权,而且在使用Windows身份验证时处于活动状态。
-UrlAuthorization:UrlAuthorizationModule类进行统一资源定位器(URL)授权,它基于URL命名空间来控制授权。URL命名空间可能与
NTFS权限使用的物理文件夹和文件路径存在很大的差异。
*授权
。若要建立访问特定目录的条件,则必段将一个包含<authorization>部分的配置文件放置在该目录中。为该目录设置的条件也会应用到
其子目录,除非子目录中的配置文件重写这些条件。此部分的常规语法如所示:
<[element][users][roles][verbs]/>元素是必需的。必须包含users或roles属性。可以同时包含二者,但这不是必需的。
以下示例向kim和管理员角色的成员授予权限,而拒绝john和所有匿名用户:
<authorization>
<allow users="kim" />
<allow roles="Admins" />
<deny users="john" />
<deny users="?" />
</authorization>
若要允许john并拒绝其他任何人,可以构造下面的配置部分。
<authorization>
<allow users="john" />
<deny users="*" />
</authorization>
下面的示例允许每个人使用GET,但只有Kim可以使用POST。
<authorization>
<allow verb="GET" users="*" />
<allow verb="POST" users="kim" />
<deny verb="POST" users="*" />
</authorization>
*ASP.NET模拟
缺省情况下,ASP.NET应用程序以本机的ASPNET账号运行。该帐号属于普通用户组,权限受到一定的限制,以保障ASP.NET应用程序运行的
安全。但是有时需要某个ASP.NET应用程序或者程序中的某段代码执行需要特定权限的操作,比如某个文件的存取,这时就需要给该程序
或相应的某段代码赋予某个账号的权限以执行该操作,这种方法称之为身份模拟(Impersonation)。
*启用模拟的方法
。在ASP.NET应用程序中使用身份模拟一般物于资源访问控制,主要有如下几种方法:
-模拟IIS认证账号:
<identity impersonate="true"/>
-在某个ASP.NET应用程序中模拟指定的用户账号
<identiey impersonate="true" userName="accountname" password="password" />
-在代码中模拟IIS认证账号
-在代码中模拟指定的用户账号。
*启用模拟的方法
。在代码中使用身份模拟更加灵活,可以在指定的代码段中使用身份模拟,在该代码段之外恢复使用ASPNET本机账号。该方法要求必须使
用Windows的认证身份标识。
(我创建项目试验过,用表单认证也行!不知道在实际项目中会怎么样,不过一点肯定的,效率会有影响!)
*ASP.NET进程标识
。使用权限最小的账户
-使用权限最少的账户可以减少与进程攻击相关的威胁。
。避免作为SYSTEM运行
。域控制器和ASP.NET进程账户
-一般情况下,不建议在域控制器上运行Web服务器,因为对服务器的攻击就是对域的攻击。
。使用默认ASPNET账户
-已将本地ASPNET账户明确配置为使用可能最少的权限集运行ASP.NET Web应用程序。如果可能,尽量使用ASPNET。
*存储机密
。Web应用程序通常需要存储机密。需要妥善保管这些机密,以防止不道德的管理员和有恶意的Web用户进行访问
。机密的典型示例包括:
-SQL连接字符串。一个常见的错误是以纯文本形式存储用户名和密码。
-Web.config中的固定标识。
-Machine.config中的进程标识。
-用于安全地存储数据的密钥。
-用于根据数据库进行表单身份验证的密码。
*在ASP.NET中存储机密的选项
NET Web应用程序开发人员可以使用多种方法来存储机密。它们包括:
。.NET加密类。.NET框架包含可用于加密和解密的类。这此方法要求安全存储加密密钥。
。数据保护API(DPAPI)。DPAPI是一对Win32 API,它使用从用户密码派生的密钥对数据进行加密和解密。在使用DPAPI时,您并不需要进
行密钥管理。操作系统对作为用户密码的密钥进行管理。
。COM+构造函数字符串。如果应用程序使用服务组件,则可以在对象构造字符串中存储机密。该字符串以明文形式存储在COM+目录中。
。CAPICOM。这是一个Microsoft COM对象,它提供对基础加密API基于COM的访问。
。加密API。这些API是执行加密和解密的低级Win32 API.
*使用加密
。使用名称空间
System.Security.Cryptography:该命名空间提供加密服务,包括安全的数据编码和解码,以及许多其他操作,例如散列法,随机数据生 成和消息身份验证。
。使用RNGCryptoServiceProvider,代替System.Random.
*使用最佳实践
。如果应用程序使用表单身份验证,而全在用户身份验证中需要考虑性能的问题,则检索角列表并将其存储在身份验证票中。
。如果使用表单身份验证,则始终给每个请求创建一个主体并将其存储在上下文中。
。如果角色太多而无法存储在身份验证Cookie中,则使用全局应用程序缓存来存储角色。
。不要创建权限最少的自定义账户来运行ASP.NET。而是应更改ASPNET账户密码,并在应用程序需要访问的任何远程Windows服务器上创建重复账户。
。如果必须创建自定义账户以运行ASP.NET,请使用权限最少的用户。
。如果主要考虑管理问题,请使用权限最少的域账户。
。如果使用本地账户,则必须在Web应用程序需要访问的任何远程计算机上创建重复账户;如果应用程序需要访问非信任域中的资源或者防火墙禁止Windows身份验证,则必须使用本地账户。
。不要使用本地System账户来运行ASP.NET.
。不要给ASPNET账户授予“充当操作系统的一部分”权限。
。在以下情况中使用SSL:
-在浏览器和Web服务器这间传送安全敏感信息时。
-使用基本身份验证(以保护凭据)时。
-使用表单身份验证进行身份验证(与个性化相对)时。
。避免使用纯文本形式存储机密。