本主题讨论 Windows® Identity Foundation (WIF) 中的已知问题以及现有解决方法。
ASP.NET 将被动联合身份验证令牌检测为潜在安全攻击
症状
在依赖方应用程序处,被动联合身份验证方案失败,错误消息如下。
从客户端中检测到有潜在危险的 Request.Form 值…
描述:请求验证过程检测到有潜在危险的客户端输入值,对请求的处理已经中止。 该值可能指示危及应用程序安全的尝试,如跨站点的脚本攻击。 通过在 Page 指令或配置部分中设置 validateRequest=false 可以禁用请求验证。 但是,在这种情况下,强烈建议应用程序显式检查所有输入。
原因
在使用 WIF FederatedPassiveSignIn 控件的被动联合身份验证方案中,会将安全令牌以字符串的形式传递回信赖方应用程序。ASP.NET 会将这些令牌检测为对网站的潜在攻击,并会采取预防措施,即终止对请求的处理。
解决方法
禁用 ASP.NET 请求验证功能。 为此,请在网页的 .aspx 文件中按如下方式设置 Page ValidateRequest。
<%@ Page ValidateRequest="false"%>
或者,在 Web 应用程序的 Web.config 文件中,将 <pages/> 部分的 validateRequest 属性设置为 False。
<configuration> <system.web> <pages validateRequest="false" /> </system.web> </configuration>
备注
ASP.NET 请求验证功能旨在帮助降低对网页和 ASP.NET 应用程序进行跨站点脚本攻击的风险。 如果应用程序未正确验证用户输入,则可能会遭受多种类型的恶意输入攻击。 这些攻击包括跨站点脚本攻击和 SQL Server 注入攻击。 除了仔细评估应用程序中所有形式的输入并确保这些输入已经过正确验证或编码,或确保在处理数据或将信息发送回客户端之前已退出应用程序外,没有任何其他替代方法。 有关跨站点脚本攻击的详细信息,请参阅卡内基梅隆大学计算机应急响应小组 (CERT) 站点提供的恶意 HTML 标记通告(英文)。 有关请求验证的详细信息,请参阅有关请求验证的 www.asp.net 白皮书(英文)。
SVCUtil 引发异常
症状
如果您有一个基于 WCF 的依赖方,而它配置有联合绑定,其中颁发者地址指向具有 5 个或更多终结点的 STS,且该 STS 是使用 WIF 构建的,则当您针对该依赖方运行 svcutil.exe 时,它会引发以下异常:
Microsoft (R) Service Model Metadata Tool [Microsoft (R) Windows (R) Communication Foundation, Version 3.0.4506.2088] Copyright (c) Microsoft Corporation. All rights reserved.
Attempting to download metadata from 'https://localhost:8008/RP/mex' using WS-Metadata Exchange or DISCO. Error: Obtaining metadata from issuer 'https://localhost:8000/Sts/mex' failed with error 'System.InvalidOperationException: Metadata contains a reference that cannot be resolved: 'https://localhost:8000/Sts/mex'. ---> System.ServiceModel.CommunicationException: The maximum message size quota for incoming messages (65536) has been exceeded. To increase the quota, use the MaxReceivedMessageSize property on the appropriate binding element. ---> System.ServiceModel.QuotaExceededException: The maximum message size quota for incoming messages (65536) has been exceeded. To increase the quota, use the MaxReceivedMessageSize property on the appropriate binding element.
原因
Svcutil.exe 是随 .NET Framework 3.5 版 一起提供的工具,可用于通过下载服务的 WSDL 生成与 Web 服务通信的代理和配置。 该工具还可以生成与安全令牌服务 (STS) 进行联合身份验证的服务的代理。 默认情况下,该工具只能下载 64 KB 大小的 WSDL。 具有五个或更多终结点的 STS 会生成大于 64 KB 的 WSDL,因此会引发“最大消息大小”异常。
解决方法
可以配置 svcutil.exe 来提高大小限制。 Svcutil.exe.config 是随 WIF 一起提供的示例配置,可在 WIF 安装目录中找到。 此示例配置让 svcutil.exe 可以读取由 STS 生成的最大 64 MB 的 WSDL。 该配置涵盖在 WCF 中公开 WSDL 时可使用的全部四种传输方法(http、https、net.tcp 和 net.pipe),还可提高所有这四种传输方法的 WSDL 大小限制。 要使用此配置文件,请将此配置复制到 svcutil.exe 所在的目录,然后运行 svcutil.exe。请注意,Windows CardSpace 客户端不会发生此问题。
在 WCF 应用程序中启用 Windows Identity Foundation 后 CustomAuthorizationManager 不再有效
症状
如果已实施 CustomAuthorizationManager,则使用 ConfigureServiceHost 启用 WIF 后,CustomAuthorizationManager 将不再有效。
原因
WIF 会使用自己的类替换默认的 ServiceAuthorizationManager,以便与 WCF 主机环境完全集成。 如果在调用 ConfigureServiceHost 之前配置 ServiceAuthorizationManager,WIF 会使用 WIF 的版本替换自定义 ServiceAuthorizationManager。
解决方法
有关详细信息,请参阅 WCF 应用程序兼容性。
当 mapToWindows 为 True 且 useWindowsTokenService 为 False 时 ASP.NET RP 引发异常
症状
如果 ASP.NET RP 配置有 Saml11SecurityTokenHandler 或 Saml2SecurityTokenHandler,且 SamlSecurityTokenRequirement 元素上的 MapToWindows 设置为 true 而 UseWindowsTokenService 特性值设置为 false 时,该 RP 上将引发以下异常:
Server Error in '/ClaimsAwareWebApp' Application. ________________________________________ Either a required impersonation level was not provided, or the provided impersonation level is invalid. (Exception from HRESULT: 0x80070542)
解决方法
始终将 SamlSecurityTokenRequirement 元素上的 MapToWindows 和 UseWindowsTokenService 都设置为 true。
由 Windows Identity Foundation 写入的 HttpCookie 的 Secure 属性默认设置为 False
症状
由 WIF 写入的 HttpCookie 的 Secure 属性默认设置为 false。 网站的登录页可能受到 SSL 的保护,而内部页面并没有受到保护。 如果 HttpCookie 不安全,客户端会将其随每个请求发送到网站,而无论请求的页面是否受到 SSL 保护。 这样,其他客户端便可截获 cookie 并使用它来访问不受 SSL 保护的其他页面。
解决方法
始终将 HttpCookie 的 Secure 属性设置为 true。 这可确保客户端只在请求受 SSL 保护的页面时发送 cookie。
在同一通道上进行多次调用时 CreateChannelActingAs 和 CreateChannelOnBehalfOf 失败
症状
如果使用通过 CreateChannelActingAs 或 CreateChannelOnBehalfOf 方法创建的通道进行多次调用,WIF 可能会引发异常。
解决方法
有三种解决方法:
启用与后端服务的会话。
每次调用都创建一个通道。