配置步骤 4:配置应用程序安全性

作者:Keith Newman 和 Robert McMurray

在此生成 ASP.NET 网站的阶段中,你将配置在 IIS 中可用的安全性设置。 以下部分讨论了 ASP.NET 应用程序的常见安全性设置:

4.1. 隔离 Web 应用程序

实现以下建议,在服务器上隔离网站和 Web 应用程序。

  • 对每个网站或 Web 应用程序使用一个应用程序池。
  • 限制针对应用程序池标识的站点文件夹和文件的访问权限。
  • 为每个站点设置一个独立的 ASP.NET 临时文件夹并且只提供对应用程序池标识的访问权限。
  • 请确保在只允许访问到应用程序池标识的每个站点根上设置 ACL(访问控制列表)。

如果每个应用程序池具有多个应用程序,请考虑创建足够的应用程序池并将一些应用程序移动到新的池。

创建应用程序池

  1. 打开 IIS 管理器。
  2. 在“连接”窗格中,单击“应用程序池”
  3. 在“操作”窗格中,单击“添加应用程序池”
  4. 在“名称”框中,键入应用程序池的唯一名称。
  5. 选择“.NET Framework 版本”和“托管管道模式”。
  6. 单击“确定”。

将应用程序移动至另一个应用程序池

  1. 打开 IIS 管理器。
  2. 在“连接”页面中,选择你想要移动的网站或 Web 应用程序。
  3. 在“操作”窗格中,单击“基本设置”
  4. 在“编辑站点”对话框上单击“选择”,打开“选择应用程序池”对话框,然后选择“应用程序池”菜单中的应用程序池。
  5. 单击“确定”关闭“选择应用程序池”对话框,单击“确定”关闭“编辑站点”菜单。

将应用程序池标识添加到某个文件夹或某个文件 ACL

  1. 打开 Windows 资源管理器并导航到该文件夹或文件。
  2. 右键单击该文件夹或文件,然后单击“属性”
  3. 选择“安全”选项卡,然后单击“编辑”
  4. 依次单击“添加”、“位置”,并且选择要作为位置进行搜索的服务器。
  5. 在“输入要选择的对象名称”框中,键入 IIS APPPOOL\applicationPoolName,其中 applicationPoolName 是应用程序池标识。
  6. 依次单击“确定”、“确定”并再次单击“确定”,关闭对话框。

4.2。 .NET 信任级别

本部分介绍了如何使用 IIS 管理器 UI 或命令行设置应用程序信任级别。

使用 UI 设置信任级别

  1. 打开 IIS 管理器并导航到你想要管理的级别。
  2. 在“功能视图”中,双击“.NET 信任级别”。
  3. 在“.NET 信任级别”页面上,从“信任级别”下拉列表中选择一个信任级别,然后单击“操作”窗格中的“应用”。

使用命令行设置信任级别

若要设置信任级别,请使用以下语法:

appcmd set config /commit:WEBROOT /section:trust /level:Full|High|Medium|Low|Minimal

级别属性为与预先配置的 CAS 策略文件对应的五个值之一。 例如,若要设置 Full 的信任级别,请在命令提示符下键入以下内容,然后按 ENTER:

appcmd set config /commit:WEBROOT /section:trust /level:Full

注意

在 IIS 8 中使用 Appcmd.exe 在全局级别配置信任元素时,请在命令中指定 /commit:WEBROOT,以便对根 Web.config 文件而不是对 ApplicationHost.config 进行配置更改。

4.3。 .NET 身份验证

在“在 IIS 上规划 ASP.NET 网站”中,你做出了有关哪一身份验证模式适合于你的应用程序的设计决策。

ASP.NET 表单身份验证

本部分介绍了如何使用 IIS 管理器 UI 或命令行配置 ASP.NET 表单身份验证。

使用 UI 配置表单身份验证

  1. 打开 IIS 管理器并导航到你想要管理的级别。
  2. 在“功能视图”中双击“身份验证”。
  3. 在“身份验证”页面上,选择“表单身份验证”。
  4. 在“操作”窗格中,单击“启用”以使用具有默认设置的表单身份验证。
  5. 在“操作”窗格中,单击“编辑”。
  6. 在“编辑表单身份验证设置”对话框的“登录 URL”文本框中,键入客户端登录页的名称。
  7. 在“身份验证 Cookie 超时(分钟)”文本框中,键入要用于超时值的分钟数。
  8. 从“模式”列表中,选择要使用的 Cookie 模式。
  9. 在“名称”文本框中,键入 Cookie 的名称。
  10. 从“连接模式”列表中,选择要使用的保护模式。
  11. 选中“请求 SSL”复选框。
  12. 选中“对每个请求延长 Cookie 到期时间”复选框,然后单击“确定”。

使用命令行配置表单身份验证

若要启用表单身份验证,请使用以下语法:

appcmd set config /commit:WEBROOT /section:system.web/authentication /mode:None|Windows|Passport|Forms

默认情况下,IIS 8 将 mode 属性设置为 Windows,这会禁用表单身份验证。 如果将该属性设置为 Forms,则会启用表单身份验证。 例如,如要启用表单身份验证,请在命令提示符下键入以下内容,然后按 ENTER:

appcmd set config /commit:WEBROOT /section:system.web/authentication /mode:Forms

注意

在 IIS 8 中使用 Appcmd.exe 在全局级别配置身份验证元素时,请在命令中指定 /commit:WEBROOT,以便对根 Web.config 文件而不是对 ApplicationHost.config 进行配置更改。

若要指定用于表单身份验证的登录 URL,请使用以下语法:

appcmd set config /commit:WEBROOT /section:system.web/authentication /forms.loginURL:string

forms.loginURL:string 变量是客户端的登录页名称。 默认值为 Login.aspx。 例如,若要指定用于表单身份验证的登录 URL,请在命令提示符下键入以下内容,然后按 ENTER:

appcmd set config /commit:WEBROOT /section:system.web/authentication /forms.loginURL:login.aspx

注意

在 IIS 8 中使用 Appcmd.exe 在全局级别配置身份验证元素时,请在命令中指定 /commit:WEBROOT,以便对根 Web.config 文件而不是对 ApplicationHost.config 进行配置更改。

若要指定用于表单身份验证的身份验证超时,请使用以下语法:

appcmd set config /commit:WEBROOT /section:system.web/authentication /forms.timeout:TimeSpan

变量 forms.timeout:TimeSpan 是时间(以分钟为单位),表示经过此时间后,用于身份验证的 Cookie 便会过期。 默认值为 30 分钟。 例如,若要指定用于表单身份验证的身份验证超时,请在命令提示符下键入以下内容,然后按 ENTER:

appcmd set config /commit:WEBROOT /section:system.web/authentication /forms.timeout:30

注意

在 IIS 8 中使用 Appcmd.exe 在全局级别配置身份验证元素时,必须在命令中指定 /commit:WEBROOT,以便对根 Web.config 文件而不是对 ApplicationHost.config 进行配置更改。

若要配置用于表单身份验证的 Cookie 名称,请使用以下语法:

appcmd set config /commit:WEBROOT /section:system.web/authentication /forms.name:string

forms.name:string 变量是用于表单身份验证的 Cookie 的名称。 默认值为 .ASPXAUTH。 例如,若要配置用于表单身份验证的 Cookie 名称,请在命令提示符下键入以下内容,然后按 ENTER:

appcmd set config /commit:WEBROOT /section:system.web/authentication /forms.name:.ASPXUTH

若要配置用于表单身份验证的 Cookie 模式,请使用以下语法:

appcmd set config /commit:WEBROOT /section:system.web/authentication /forms.cookieless:UseUri|UseCookies|AutoDetect|UseDeviceProfile

forms.cookieless 的默认值为 UseDeviceProfile。 例如,若要将用于表单身份验证的 Cookie 模式配置为使用“使用设备配置文件”设置,请在命令提示符处键入如下命令,然后按 ENTER:

appcmd set config /commit:WEBROOT /section:system.web/authentication /forms.cookieless:UseDeviceProfile

若要配置用于表单身份验证的 Cookie 保护模式,请使用以下语法:

appcmd set config /commit:WEBROOT /section:system.web/authentication /forms.protection:All|None|Encryption|Validation

forms.protection 的默认值为 All。 例如,若要将用于表单身份验证的 Cookie 保护模式配置为使用“加密和验证”设置,请在命令提示符处键入如下命令,然后按 ENTER:

appcmd set config /commit:WEBROOT /section:system.web/authentication /forms.protection:All

若要对身份验证 Cookie 要求使用 SSL,请使用以下语法:

appcmd set config /commit:WEBROOT /section:system.web/authentication /forms.requireSSL:true|false

forms.requireSSL 的默认值为 false。 如果将此属性设置为 true,则要求使用 SSL。 例如,若要对身份验证 Cookie 要求使用 SSL,请在命令提示符下键入以下内容,然后按 ENTER:

appcmd set config /commit:WEBROOT /section:system.web/authentication /forms.requireSSL:true

若要缓存经常请求的内容,请使用以下语法:

appcmd set config /commit:WEBROOT /section:system.web/authentication /forms.slidingExpiration:true|false

forms.slidingExpiration 的默认值为 true。 例如,若要缓存经常请求的内容,请在命令提示符下键入以下内容,然后按 ENTER:

appcmd set config /commit:WEBROOT /section:system.web/authentication /forms.slidingExpiration:true

ASP.NET 模拟身份验证

使用 UI 配置模拟身份验证

  1. 打开 IIS 管理器并导航到你想要管理的级别。
  2. 在“功能视图”中双击“身份验证”。
  3. 在“身份验证”页面上,选择“ASP.NET 模拟”。
  4. 在“操作”窗格中,单击“启用”以使用具有默认设置的 ASP.NET 模拟身份验证。
  5. (可选)在“操作”窗格中,单击“编辑”以设置安全主体。
  6. 在“编辑 ASP.NET 模拟设置”对话框中,选择“特定用户”或“已通过身份验证的用户”。 无论你决定使用哪个选项,IIS 都会将该标识用作 ASP.NET 应用程序的安全性上下文。 默认情况下,IIS 8 将设置为模拟已通过身份验证的用户。
  7. 单击“确定”以完成或前进到后续可选步骤来更改要模拟的标识。
  8. (可选)单击“设置”以更改“特定用户”标识。
  9. 在“设置凭据”对话框中,请为 IIS 应用于匿名访问的新帐户执行以下操作:在“用户名”中输入现有用户帐户的名称,在“密码”中输入与该用户帐户关联的密码,然后在“确认密码”中输入与该密码完全相同的值。
  10. 单击“确定”以关闭“设置凭据”对话框。
  11. 单击“确定”以关闭“编辑 ASP.NET 模拟设置”对话框。

使用命令行配置模拟身份验证

若要启用或禁用 ASP.NET 模拟,请使用以下语法:

appcmd set config /commit:WEBROOT /section:identity /impersonate:true|false

默认情况下,IIS 会将 impersonate 属性设置为 false,这会禁用 ASP.NET 模拟身份验证。 如果将该属性设置为 true,则会启用 ASP.NET 模拟身份验证。 例如,若要启用 ASP.NET 模拟身份验证,请在命令提示符下键入以下内容,然后按 ENTER:

appcmd set config /commit:WEBROOT /section:identity /impersonate:true

还可以选择使用以下语法设置供 IIS 用于模拟的帐户:

appcmd set config /commit:WEBROOT /section:identity /userName:string /password:string

变量 userName:string 是 IIS 用来模拟的帐户,变量 password:string 是密码。 例如,若要使用名为 Moe 的帐户来供 IIS 进行模拟,请在命令提示符下键入以下内容,然后按 ENTER:

appcmd set config /commit:WEBROOT /section:identity /userName: Moe /password:pass@word1

注意

在 IIS 8 中使用 Appcmd.exe 在全局级别配置标识元素时,请在命令中指定 /commit:WEBROOT,以便对根 Web.config 文件而不是对 ApplicationHost.config 进行配置更改。

4.4。 计算机密钥设置

本部分介绍了如何使用 IIS 管理器 UI 为 ASP.NET 应用程序生成计算机密钥。

使用 UI 生成计算机密钥

  1. 打开 IIS 管理器并导航到你想要管理的级别。
  2. 在“功能视图”中,双击“计算机密钥”。
  3. 在“计算机密钥”页面上,从“验证方法”列表中选择一个验证方法。 默认验证方法是“SHA1”。
  4. 从“加密方法”列表中选择加密方法。 默认加密方法是“自动”。
  5. (可选)配置验证和解密密钥的设置。
  6. 在“操作”窗格中,单击“生成密钥”,然后单击“应用”。

4.5。 TLS/SSL 通信

本部分介绍了如何为应用程序配置 TLS/SSL 安全。

从证书颁发机构 (CA) 获取服务器证书后,演练以下部分中的过程:

  1. SSL 绑定
  2. 要求你的站点使用 SSL
  3. 客户端证书

SSL 绑定

本部分介绍了如何使用 IIS 管理器 UI 或命令行来将 SSL 绑定添加到你的站点。

使用 UI 将 SSL 绑定添加到站点

  1. 打开 IIS 管理器。
  2. 在“连接”窗格中,展开树中的“站点”节点,然后单击要为其添加绑定的站点以将其选中。
  3. 操作窗格中,单击绑定
  4. 在“网站绑定” 对话框中,单击“添加”
  5. 在“添加站点绑定”对话框的“类型”列表中,选择“https”。
  6. 从“IP 地址”列表中,选择“全部未分配”(除非有要使用的特定 IP 地址)。
  7. 在“端口”框中,键入端口号(默认值为 443)。
  8. 在“主机名”框中,键入主计算机的名称。
  9. 如果你要使用同一 IP 地址提供多个安全的网站,请选中“需要服务器名称指示”复选框。
  10. 从“SSL 证书”列表中,为你的网站选择证书。 如果你的证书没有出现在列表中,则请单击“选择”,然后使用“选择证书”对话框搜索证书。
  11. 单击“确定”。

使用命令行将 SSL 绑定添加到站点

若要将绑定添加到站点,请使用以下语法:

appcmd set site /site.name:string /+bindings.[protocol='string', bindingInformation='string']

变量 site.name:string 是要将绑定添加到其中的站点的名称。 变量 protocol='string' 是要使用的协议,变量 bindingInformation='string' 是 IP 地址、端口和主机头的组合。

例如,若要将名为 contoso 的站点配置为对端口 443 上所有不带主机头的 IP 地址使用 HTTPS 绑定,请在命令提示符下键入以下内容,然后按 ENTER:

appcmd set site /site.name:contoso /+bindings.[protocol='https', bindingInformation='*:443:']

要求你的站点使用 SSL

本部分介绍了如何使用 IIS 管理器 UI 或命令行来要求你的网站使用 SSL。

使用 UI 要求使用 SSL

  1. 打开 IIS 管理器并导航到你想要管理的级别。 请确保你处于站点、应用程序或目录级别上;“SSL 设置”在服务器级别上不可用。

    注意

    如果要在文件级别上配置 SSL,则请在“内容视图”中导航至该文件,然后在“操作”窗格中单击“切换到功能视图”。

  2. 在“功能视图”中,双击“SSL 设置”。

  3. 在“SSL 设置”页面上,选择“要求使用 SSL”。

  4. 在“操作”窗格中,单击“应用”

使用命令行要求使用 SSL

若要要求使用 SSL,请使用以下语法:

appcmd set config "site|URL" /section:access /sslFlags:Ssl /commit:APPHOST

变量 site|URL 是你希望 IIS 8 对其要求使用 SSL 的站点、应用程序、虚拟目录或文件。 例如,若要对默认网站要求使用 SSL,请在命令提示符下键入以下内容,然后按 ENTER:

appcmd set config "Default Web Site" /section:access /sslFlags:Ssl /commit:APPHOST

若要对默认网站上的文件 iisstart.htm 要求使用 SSL,请在命令提示符下键入以下内容,然后按 ENTER:

appcmd set config "http://localhost/iisstart.htm" /section:access /sslFlags:Ssl /commit:APPHOST

客户端证书

使用 UI 指定客户端证书

  1. 打开 IIS 管理器并导航到你想要管理的级别。 请确保你处于站点、应用程序或目录级别上;“SSL 设置”在服务器级别上不可用。

    注意

    如果要在文件级别上配置 SSL,则请在“内容视图”中导航至该文件,然后在“操作”窗格中单击“切换到功能视图”。

  2. 在“功能视图”中,双击“SSL 设置”。

  3. 在“SSL 设置”页面上,可以选择“要求使用 SSL”。 在“忽略”或“接受”客户端证书时,并不需要 SSL。

  4. 在“SSL 设置”页面上的“客户端证书”区域中,请使用以下过程之一:

    • 如果你不想接受客户端证书(即使存在),请选择“忽略”。
    • 如果要接受客户端证书,请选择“接受”。
    • 如果需要使用客户端证书,请选择“需要”。 若要使用“要求客户端证书”,你必须启用“要求使用 SSL”。
  5. 在“操作”窗格中,单击“应用”

使用命令行指定客户端证书

若要指定是否使用客户端证书,请使用以下语法:

appcmd set config "site|URL" /section:access /sslFlags:Ssl|SslNegotiateCert|SslRequireCert /commit:APPHOST

变量 site|URL 是你希望 IIS 为其启用客户端证书的站点、应用程序、虚拟目录或文件。 例如,若要接受默认网站的客户端证书,请在命令提示符下键入以下内容,然后按 ENTER:

appcmd set config "Default Web Site" /section:access /sslFlags:SslNegotiateCert /commit:APPHOST

若要接受默认网站上文件 iisstart.htm 的客户端证书,请在命令提示符下键入以下内容,然后按 ENTER:

appcmd set config "http://localhost/iisstart.htm" /section:access /sslFlags:SslNegotiateCert /commit:APPHOST

你可以为 sslFlags 属性指定一个或多个值。 如果需要多个值,请用逗号 (,) 分隔各个值。 例如,若要指定需要在默认网站上提供 SSL 和客户端证书,请在命令提示符下键入以下内容,然后按 ENTER:

appcmd set config "Default Web Site" /section:access /sslFlags:Ssl,SslRequireCert /commit:APPHOST