本节提供有关 ASP.NET 体系结构与子系统之间关系的概述,因为这些与安全主题相关。下面的插图表示了 ASP.NET 中安全系统之间的关系。
如图所示,所有 Web 客户端都通过 Internet 信息服务 (IIS) 与 ASP.NET 应用程序通讯。IIS 解释请求并且有选择地对请求进行身份验证。如果“允许匿名”设置为
除了内置的 ASP.NET 功能外,ASP.NET 应用程序还可以使用 .NET Framework 的低级别安全功能。详细信息,请参阅 .NET Framework 帮助中的“密钥安全概念”主题。
在考虑 ASP.NET 身份验证时,应该理解与 IIS 身份验证服务的交互操作。
IIS 总是假定一组凭据映射到 Microsoft Windows NT 帐户并使用其来验证用户。在 IIS 5.0 和 6.0 中有三种不同身份验证方法:基本身份验证、摘要式身份验证、集成 Windows 身份验证(NTLM 或 Kerberos)。在 IIS 管理服务中,您可以选择要使用的身份验证类型。有关 IIS 身份验证的详细信息,请参阅 IIS 帮助。
如果您请求包含 ASP.NET 应用程序的 URL,此请求和身份验证信息就会被传递给该应用程序。ASP.NET 提供下表中所描述的两种其他类型的身份验证。
ASP.NET 身份验证提供程序 | 描述 |
---|---|
Forms 身份验证 | 通过其可将没有通过身份验证的请求重定向到使用 HTTP 客户端重定向的 HTML 窗体的系统。用户提供凭据并提交该窗体。如果应用程序验证该请求,系统就会在包含凭据或密钥的 Cookie 中发出身份验证票证,以重新获取该标识。后续的请求在请求标题中随 Cookie 一起发出,ASP.NET 处理程序会使用应用程序开发人员指定的任何验证方法去验证请求并给其授权。 |
Passport 身份验证 | 由 Microsoft 提供的集中身份验证服务,用于为成员站点提供单一登录和核心配置服务。 |
ASP.NET 配置(包括安全性)采用分级结构。所有用于 ASP.NET 的配置信息都包含在名称为 Web.config 和 Machine.config 的文件中,Web.config 文件可以放在与应用程序文件相同的目录中。Machine.config 文件在根安装目录下的 Config 目录中。子目录会继承目录的设置,除非被子目录中的 Web.config 文件所覆盖。在 Web.config 文件中有很多部分,每部分都对应着一类主要的 ASP.NET 功能。要查看分级配置系统处理安全问题方法的示例,请参阅分层配置结构。
Web.config 文件中的安全部分组织如下:
<authentication mode="[Windows|Forms|Passport|None]">
<forms name="[name]"
loginUrl="[url]"
protection="[All|None|Encryption|Validation]"
path="[path]" timeout="[minutes]"
requireSSL="[true|false]"
slidingExpiration="[true|false]">
<credentials passwordFormat="[Clear|MD5|SHA1]">
<user name="[UserName]"
password="[password]"/>
</credentials>
</forms>
<passport redirectUrl="internal"/>
</authentication>
<authorization>
<allow users="[comma separated list of users]"
roles="[comma separated list of roles]"/>
<deny users="[comma separated list of users]"
roles="[comma separated list of roles]"/>
</authorization>
<identity impersonate ="[true|false]"
userName="[domain\user_name]"
password="[user_password]"/>
<trust level="[Full|High|Medium|Low|Minimal]"
originUrl=""/>
<securityPolicy>
<trustLevel name="Full" policyFile="internal"/>
<trustLevel name="High" policyFile="web_hightrust.config"/>
<trustLevel name="Medium" policyFile="web_mediumtrust.config"/>
<trustLevel name="Low" policyFile="web_lowtrust.config"/>
<trustLevel name="Minimal" policyFile="web_minimaltrust.config"/>
</securityPolicy>
这些元素的默认设置如下表所示。
默认值 | 描述 |
---|---|
<allow roles= > | 没有默认值。 |
<allow users="*"> | 所有用户 |
<authentication mode="Windows"> | 身份验证模式不能在低于应用程序根目录的级别下进行设置。 |
<credentials passwordFormat="SHA1"> | 将用于密码的哈希算法。 |
<deny roles=""> | 空 |
<deny users=""> | 空 |
<forms loginUrl="login.aspx"> | 如果将模式设置为 Forms,而且该请求没有有效的票证 (Cookie),那么这就是基于窗体登录请求所定向的 URL。 |
<forms name=".ASPXAUTH"> | 默认的 Cookie 名称。 |
<forms path="/"> | 路径 |
<forms protection="All"> | 类型=[All|None|Encryption|Validation]。 |
<forms requireSSL="false"> | 指定传输身份验证 Cookie 时不需要加密的连接。 |
<forms slidingExpiration="true"> | 指定启用滑动过期。 |
<forms timeout="30"> | 超时以分钟为单位。默认值为 30 分钟。 |
<identity impersonate="false"> | 在默认情况下禁用模拟。 |
<identity userName=""> | 空 |
<identity password=""> | 空 |
<passport redirectUrl="internal"> | 如果将模式设置为 Passport,而且所请求的页面需要身份验证信息(匿名用户的访问遭到拒绝),但用户还没有通过 Passport 登录,那么此用户将被重定向到该 URL 上。 |
<trustLevel name="Full" policyFile="internal"/> | 用于完全信任级别的默认策略文件。 |
<trustLevel name="High" policyFile="web_hightrust.config"/> | 用于“高”信任级别的默认策略文件。 |
<trustLevel name="Medium" policyFile="web_mediumtrust.config"/> | 用于“中”信任级别的默认策略文件。 |
<trustLevel name="Low" policyFile="web_lowtrust.config"/> | 用于“低”信任级别的默认策略文件。 |
<trustLevel name="Minimal" policyFile="web_minimaltrust.config"/> | 用于“最低”信任级别的默认策略文件。 |
<user name=""> | 空 |
<user password=""> | 空 |
Web.config 文件有三个主要的子部分:身份验证、授权和标识。通常这样设置每个安全元素的值:用应用程序根目录下应用程序配置文件中相似的部分去覆盖计算机级别配置文件中的部分。所有的子目录都会自动继承那些设置。但是,子目录可以拥有其自己的配置文件用于覆盖其他设置。
注意 ASP.NET 配置仅应用于 ASP.NET 资源(那些已注册由 Aspnet_isapi.dll 处理的资源)。但 ASP.NET 不能为非 Aspnet_isapi.dll 资源提供授权,所以在符合 IIS 权限的情况下,所有用户依然可以访问 TXT、HTML、GIF、JPEG、ASP 和其他类型的文件。例如,即使 Web.config 文件可能限制了某个目录中的 ASP.NET 资源,如果打开了目录浏览且没有其他限制,所有用户依然可以查看位于那个目录中的文件。
通过使用 IIS 管理工具明确地将这些文件而不是目录映射到 Aspnet_isapi.dll,可以避免这种情况发生。但是,这样可能会对性能产生影响。
您可以使用 <location></location> 标记指定应该应用这些设置的特定文件或目录。有关如何使用 <location> 标记的详细信息,请参阅配置 <Location> 设置和 <location> 元素。