配置步骤 4:配置应用程序安全性
作者:Keith Newman 和 Robert McMurray
在此生成 ASP.NET 网站的阶段中,你将配置在 IIS 中可用的安全性设置。 以下部分讨论了 ASP.NET 应用程序的常见安全性设置:
4.1. 隔离 Web 应用程序
实现以下建议,在服务器上隔离网站和 Web 应用程序。
- 对每个网站或 Web 应用程序使用一个应用程序池。
- 限制针对应用程序池标识的站点文件夹和文件的访问权限。
- 为每个站点设置一个独立的 ASP.NET 临时文件夹并且只提供对应用程序池标识的访问权限。
- 请确保在只允许访问到应用程序池标识的每个站点根上设置 ACL(访问控制列表)。
如果每个应用程序池具有多个应用程序,请考虑创建足够的应用程序池并将一些应用程序移动到新的池。
创建应用程序池
- 打开 IIS 管理器。
- 在“连接”窗格中,单击“应用程序池”。
- 在“操作”窗格中,单击“添加应用程序池”。
- 在“名称”框中,键入应用程序池的唯一名称。
- 选择“.NET Framework 版本”和“托管管道模式”。
- 单击“确定”。
将应用程序移动至另一个应用程序池
- 打开 IIS 管理器。
- 在“连接”页面中,选择你想要移动的网站或 Web 应用程序。
- 在“操作”窗格中,单击“基本设置”。
- 在“编辑站点”对话框上单击“选择”,打开“选择应用程序池”对话框,然后选择“应用程序池”菜单中的应用程序池。
- 单击“确定”关闭“选择应用程序池”对话框,单击“确定”关闭“编辑站点”菜单。
将应用程序池标识添加到某个文件夹或某个文件 ACL
- 打开 Windows 资源管理器并导航到该文件夹或文件。
- 右键单击该文件夹或文件,然后单击“属性”。
- 选择“安全”选项卡,然后单击“编辑”。
- 依次单击“添加”、“位置”,并且选择要作为位置进行搜索的服务器。
- 在“输入要选择的对象名称”框中,键入 IIS APPPOOL\applicationPoolName,其中 applicationPoolName 是应用程序池标识。
- 依次单击“确定”、“确定”并再次单击“确定”,关闭对话框。
4.2。 .NET 信任级别
本部分介绍了如何使用 IIS 管理器 UI 或命令行设置应用程序信任级别。
使用 UI 设置信任级别
- 打开 IIS 管理器并导航到你想要管理的级别。
- 在“功能视图”中,双击“.NET 信任级别”。
- 在“.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 配置表单身份验证
- 打开 IIS 管理器并导航到你想要管理的级别。
- 在“功能视图”中双击“身份验证”。
- 在“身份验证”页面上,选择“表单身份验证”。
- 在“操作”窗格中,单击“启用”以使用具有默认设置的表单身份验证。
- 在“操作”窗格中,单击“编辑”。
- 在“编辑表单身份验证设置”对话框的“登录 URL”文本框中,键入客户端登录页的名称。
- 在“身份验证 Cookie 超时(分钟)”文本框中,键入要用于超时值的分钟数。
- 从“模式”列表中,选择要使用的 Cookie 模式。
- 在“名称”文本框中,键入 Cookie 的名称。
- 从“连接模式”列表中,选择要使用的保护模式。
- 选中“请求 SSL”复选框。
- 选中“对每个请求延长 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 配置模拟身份验证
- 打开 IIS 管理器并导航到你想要管理的级别。
- 在“功能视图”中双击“身份验证”。
- 在“身份验证”页面上,选择“ASP.NET 模拟”。
- 在“操作”窗格中,单击“启用”以使用具有默认设置的 ASP.NET 模拟身份验证。
- (可选)在“操作”窗格中,单击“编辑”以设置安全主体。
- 在“编辑 ASP.NET 模拟设置”对话框中,选择“特定用户”或“已通过身份验证的用户”。 无论你决定使用哪个选项,IIS 都会将该标识用作 ASP.NET 应用程序的安全性上下文。 默认情况下,IIS 8 将设置为模拟已通过身份验证的用户。
- 单击“确定”以完成或前进到后续可选步骤来更改要模拟的标识。
- (可选)单击“设置”以更改“特定用户”标识。
- 在“设置凭据”对话框中,请为 IIS 应用于匿名访问的新帐户执行以下操作:在“用户名”中输入现有用户帐户的名称,在“密码”中输入与该用户帐户关联的密码,然后在“确认密码”中输入与该密码完全相同的值。
- 单击“确定”以关闭“设置凭据”对话框。
- 单击“确定”以关闭“编辑 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 生成计算机密钥
- 打开 IIS 管理器并导航到你想要管理的级别。
- 在“功能视图”中,双击“计算机密钥”。
- 在“计算机密钥”页面上,从“验证方法”列表中选择一个验证方法。 默认验证方法是“SHA1”。
- 从“加密方法”列表中选择加密方法。 默认加密方法是“自动”。
- (可选)配置验证和解密密钥的设置。
- 在“操作”窗格中,单击“生成密钥”,然后单击“应用”。
4.5。 TLS/SSL 通信
本部分介绍了如何为应用程序配置 TLS/SSL 安全。
从证书颁发机构 (CA) 获取服务器证书后,演练以下部分中的过程:
SSL 绑定
本部分介绍了如何使用 IIS 管理器 UI 或命令行来将 SSL 绑定添加到你的站点。
使用 UI 将 SSL 绑定添加到站点
- 打开 IIS 管理器。
- 在“连接”窗格中,展开树中的“站点”节点,然后单击要为其添加绑定的站点以将其选中。
- 在操作窗格中,单击绑定。
- 在“网站绑定” 对话框中,单击“添加” 。
- 在“添加站点绑定”对话框的“类型”列表中,选择“https”。
- 从“IP 地址”列表中,选择“全部未分配”(除非有要使用的特定 IP 地址)。
- 在“端口”框中,键入端口号(默认值为 443)。
- 在“主机名”框中,键入主计算机的名称。
- 如果你要使用同一 IP 地址提供多个安全的网站,请选中“需要服务器名称指示”复选框。
- 从“SSL 证书”列表中,为你的网站选择证书。 如果你的证书没有出现在列表中,则请单击“选择”,然后使用“选择证书”对话框搜索证书。
- 单击“确定”。
使用命令行将 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
打开 IIS 管理器并导航到你想要管理的级别。 请确保你处于站点、应用程序或目录级别上;“SSL 设置”在服务器级别上不可用。
注意
如果要在文件级别上配置 SSL,则请在“内容视图”中导航至该文件,然后在“操作”窗格中单击“切换到功能视图”。
在“功能视图”中,双击“SSL 设置”。
在“SSL 设置”页面上,选择“要求使用 SSL”。
在“操作”窗格中,单击“应用”。
使用命令行要求使用 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 指定客户端证书
打开 IIS 管理器并导航到你想要管理的级别。 请确保你处于站点、应用程序或目录级别上;“SSL 设置”在服务器级别上不可用。
注意
如果要在文件级别上配置 SSL,则请在“内容视图”中导航至该文件,然后在“操作”窗格中单击“切换到功能视图”。
在“功能视图”中,双击“SSL 设置”。
在“SSL 设置”页面上,可以选择“要求使用 SSL”。 在“忽略”或“接受”客户端证书时,并不需要 SSL。
在“SSL 设置”页面上的“客户端证书”区域中,请使用以下过程之一:
- 如果你不想接受客户端证书(即使存在),请选择“忽略”。
- 如果要接受客户端证书,请选择“接受”。
- 如果需要使用客户端证书,请选择“需要”。 若要使用“要求客户端证书”,你必须启用“要求使用 SSL”。
在“操作”窗格中,单击“应用”。
使用命令行指定客户端证书
若要指定是否使用客户端证书,请使用以下语法:
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