IIS 托管具有 SSL 安全性的 WCF -“HTTP 请求被客户端身份验证方案‘匿名’禁止”错误

Posted

技术标签:

【中文标题】IIS 托管具有 SSL 安全性的 WCF -“HTTP 请求被客户端身份验证方案‘匿名’禁止”错误【英文标题】:IIS hosted WCF with SSL security -"The HTTP request was forbidden with client authentication scheme 'Anonymous'" error 【发布时间】:2014-10-11 10:22:04 【问题描述】:

我正在尝试使用传输安全性在 IIS 上托管 wcf。我找到了一个很好的教程并按照说明进行操作:http://robbincremers.me/2011/12/27/wcf-transport-security-and-client-certificate-authentication-with-self-signed-certificates/。我总是收到“客户端身份验证方案‘匿名’禁止 HTTP 请求”。我该如何处理?

到目前为止我所做的是:

    我按照here 的说明创建了自签名根授权证书。

    makecert -n "CN=TempCA" -r -sv TempCA.pvk TempCA.cer

    创建了一个由根授权证书签名的新服务器证书

    makecert -sk SignedByCA -iv TempCA.pvk -n "CN=localhost" -ic TempCA.cer localhost.cer -sr localmachine -ss My

    创建了一个由根授权证书签名的新客户端证书

    makecert -sk SignedByCA -iv TempCA.pvk -n "CN=clientCert" -ic TempCA.cer clientCert.cer -sr localmachine -ss My

    将 CA 添加到受信任的根证书

    将这些证书添加到个人 --> 证书

    向受信任的人添加了客户端证书

    一切正常

    创建了非常简单的 WCF 应用程序。添加它 IIS

    调整安全设置

    这是我的服务 web.config 文件

> <?xml version="1.0"?> <configuration>   <system.web>
>     <compilation debug="true" targetFramework="4.5" />
>     <httpRuntime targetFramework="4.5"/>   </system.web>   <system.serviceModel>
>     <bindings>
>       <basicHttpBinding>
>         <binding name="EmployeeBindingConfig">
>           <security mode="Transport">
>             <transport clientCredentialType="Certificate" />
>           </security>
>         </binding>
>       </basicHttpBinding>
>     </bindings>
>     <behaviors>
>       <serviceBehaviors>
>         <behavior name="EmployeeServiceBehavior">
>           <serviceMetadata httpsGetEnabled="true"/>
>           <serviceDebug includeExceptionDetailInFaults="true"/>
>           <serviceCredentials>
>             <clientCertificate>
>               <authentication certificateValidationMode="PeerOrChainTrust"
> trustedStoreLocation="LocalMachine" />
>             </clientCertificate>
>           </serviceCredentials>
>         </behavior>
>       </serviceBehaviors>
>     </behaviors>
>     <services>
>       <service
>         behaviorConfiguration="EmployeeServiceBehavior"
>         name="WCF.Tutorial.TransportSecurity.ServiceNew.EmployeeService">
>         <host>
>           <baseAddresses>
>             <add baseAddress="https://localhost/WCF.Tutorial.TransportSecurity.ServiceNew"/>
>           </baseAddresses>
>         </host>
>         <endpoint address="EmployeeService"
>                   binding="basicHttpBinding"
>                   bindingConfiguration="EmployeeBindingConfig"
>                   contract="WCF.Tutorial.TransportSecurity.ServiceNew.IEmployeeService"
> />
>         <endpoint
>            address="mex"
>            binding="mexHttpsBinding"
>            contract="IMetadataExchange" />
>       </service>
>     </services>   </system.serviceModel>   <system.webServer>
>     <modules runAllManagedModulesForAllRequests="true"/>   </system.webServer> </configuration>
    这是我的客户端 app.config
>     <?xml version="1.0" encoding="utf-8" ?>
>     <configuration>
>         <startup> 
>             <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
>         </startup>
>       <system.serviceModel>
>         <behaviors>
>           <endpointBehaviors>
>             <behavior name="EmployeeEndpointBehaviour">
>               <clientCredentials>
>                 <clientCertificate storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" findValue="omer-HP"/>
>               </clientCredentials>
>             </behavior>
>           </endpointBehaviors>
>         </behaviors>
>         <bindings>
>           <basicHttpBinding>
>             <binding name="EmployeeBindingConfig">
>               <security mode="Transport">
>                 <transport clientCredentialType="Certificate" />
>               </security>
>             </binding>
>           </basicHttpBinding>
>         </bindings>
>         <client>
>           <endpoint address="https://localhost/WCF.Tutorial.TransportSecurity.ServiceNew/EmployeeService.svc"
>                     binding="basicHttpBinding" bindingConfiguration="EmployeeBindingConfig"
>             contract="WCF.Tutorial.TransportSecurity.ServiceNew.IEmployeeService"
> name="serviceEndpoint"
> behaviorConfiguration="EmployeeEndpointBehaviour"/>
>         </client>
>       </system.serviceModel>
>     </configuration>
    这是我的客户端代码和错误

我的问题是如何传递这个错误?我需要你的帮助。

【问题讨论】:

我无法将配置文件添加为代码 sn-p。该网站没有显示这些线条,所以我不得不将它们添加为图像。 屏幕截图意味着我们无法阅读图片中的文字(或者我无法阅读它们),我们无法搜索重要的文字(如x509FindType=FindBySubjectName)。跨度> @jww,终于可以添加代码了,请审核。 【参考方案1】:

至少问题已经找到了。当我查看 Windows 事件日志时,我看到了那个错误

当请求客户端身份验证时,此服务器发送一个列表 客户信任的证书颁发机构。客户端使用这个 列表以选择服务器信任的客户端证书。 目前,该服务器信任如此多的证书颁发机构,以至于 列表太长了。因此,此列表已被截断。这 这台机器的管理员应该检查证书 信任客户端身份验证的权威机构并删除那些 真的不需要被信任。

我备份了一些证书并删除了它们。在这个操作之后,我的程序就可以工作了。

【讨论】:

【参考方案2】:

更改 IIS 网站中显示的匿名身份

【讨论】:

以上是关于IIS 托管具有 SSL 安全性的 WCF -“HTTP 请求被客户端身份验证方案‘匿名’禁止”错误的主要内容,如果未能解决你的问题,请参考以下文章

WCF 托管在 IIS 中,连接到具有集成安全性的数据库时出现问题

在 IIS 中托管时如何从代码配置 WCF 服务?

WCF服务最简单的安全方法是啥

SSL WCF“无法为具有权限‘localhost’的 SSL/TLS 安全通道建立信任关系

WCF 无法为具有权限的 SSL/TLS 安全通道建立信任关系

Log4net threadContext 与 IIS 中托管的 WCF 一起使用是不是安全?