none
客户端验证样式匿名的匿名HTTP请求被禁止。The HTTP request was forbidden with client authentication scheme 'Anonymous'. RRS feed

  • 问题

  • 我在测试WCF 安全的时候,出现如下错误:
    Transport,Certificate,WSHTTPBinding.
    MessageException was caught.
    The HTTP request was forbidden with client authentication scheme 'Anonymous'.
     客户端验证样式匿名的匿名HTTP请求被禁止。
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年8月11日 8:31
    版主

答案

  • 你好,
    请参考http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/33cc7db2-d3f6-4c61-996d-ca31b8eb52fb
    Please remember to mark the replies as answers if they help and unmark them if they provide no help. Need a sample of a technique of Microsoft? Just check out CodeFx first! http://cfx.codeplex.com/
    2009年8月13日 6:28
    版主
  • Hi Allen,
      非常感谢你的回复。这个问题你因为客户端证书设置的错误。客户端和服务端我重新制作了可以导出密钥的证书。然后设置为可信。
    在服务器端导入客户证书,在客户端导出服务器证书。makecert -sr CurrentUser -ss My -n CN=FrankCertificate -sky signature -pe
    制作的是自签名的证书,不能设置为新人证书。
    修改sky选项为exchange,可以交换密钥。因为要导出带密钥的证书,要安装到信任的证书机构和信任的人。
    1.制作一个证书。制作证书:makecert -sr localmachine -ss My -n CN=MyServerCer -sky exchange -pe -r。http://msdn.microsoft.com/zh-cn/library/aa702761.aspx
    2.导出证书文件,带密钥的pfx文件。使用mmc
    3.导入证书到信任的人。
    4.导入证书到信任的机构,这个证书就被信任了。
    然后修改客户端配置代码:
    system.serviceModel>
          <behaviors>
            <endpointBehaviors>
              <behavior name="ClientBehavior">
                <clientCredentials>
                  <clientCertificate storeName="My"
                                        x509FindType="FindBySubjectName"
                                        findValue="ClientCerWithPK"
                                        storeLocation="CurrentUser"/>
                  <serviceCertificate>
                    <defaultCertificate storeName="My" 
                                        x509FindType="FindBySubjectName"
                                        findValue="WCFServerPK"
                                        storeLocation="CurrentUser"/>
                  </serviceCertificate>
                </clientCredentials>
              </behavior>
            </endpointBehaviors>
          </behaviors>
            <bindings>
                <wsHttpBinding>
                    <binding name="WSHttpBinding_IWCFService" >
                        <security mode="Transport">
                            <transport clientCredentialType="Certificate" proxyCredentialType="None"
                                realm="" />
                            <message clientCredentialType="None" negotiateServiceCredential="false"
                                establishSecurityContext="false" />
                        </security>
                    </binding>
                </wsHttpBinding>
            </bindings>
            <client>
                <endpoint address="https://frank-xu2009:9009/WCFService"
                          binding="wsHttpBinding"
                          bindingConfiguration="WSHttpBinding_IWCFService"
                          contract="ClientProxy.IWCFService"
                          behaviorConfiguration="ClientBehavior"
                          name="WSHttpBinding_IWCFService" />
            </client>
        </system.serviceModel>

    提供证书就可以了。谢谢

    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年8月13日 9:52
    版主

全部回复


  • Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年8月12日 3:38
    版主
  • 你好,
    请参考http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/33cc7db2-d3f6-4c61-996d-ca31b8eb52fb
    Please remember to mark the replies as answers if they help and unmark them if they provide no help. Need a sample of a technique of Microsoft? Just check out CodeFx first! http://cfx.codeplex.com/
    2009年8月13日 6:28
    版主
  • Hi Allen,
      非常感谢你的回复。这个问题你因为客户端证书设置的错误。客户端和服务端我重新制作了可以导出密钥的证书。然后设置为可信。
    在服务器端导入客户证书,在客户端导出服务器证书。makecert -sr CurrentUser -ss My -n CN=FrankCertificate -sky signature -pe
    制作的是自签名的证书,不能设置为新人证书。
    修改sky选项为exchange,可以交换密钥。因为要导出带密钥的证书,要安装到信任的证书机构和信任的人。
    1.制作一个证书。制作证书:makecert -sr localmachine -ss My -n CN=MyServerCer -sky exchange -pe -r。http://msdn.microsoft.com/zh-cn/library/aa702761.aspx
    2.导出证书文件,带密钥的pfx文件。使用mmc
    3.导入证书到信任的人。
    4.导入证书到信任的机构,这个证书就被信任了。
    然后修改客户端配置代码:
    system.serviceModel>
          <behaviors>
            <endpointBehaviors>
              <behavior name="ClientBehavior">
                <clientCredentials>
                  <clientCertificate storeName="My"
                                        x509FindType="FindBySubjectName"
                                        findValue="ClientCerWithPK"
                                        storeLocation="CurrentUser"/>
                  <serviceCertificate>
                    <defaultCertificate storeName="My" 
                                        x509FindType="FindBySubjectName"
                                        findValue="WCFServerPK"
                                        storeLocation="CurrentUser"/>
                  </serviceCertificate>
                </clientCredentials>
              </behavior>
            </endpointBehaviors>
          </behaviors>
            <bindings>
                <wsHttpBinding>
                    <binding name="WSHttpBinding_IWCFService" >
                        <security mode="Transport">
                            <transport clientCredentialType="Certificate" proxyCredentialType="None"
                                realm="" />
                            <message clientCredentialType="None" negotiateServiceCredential="false"
                                establishSecurityContext="false" />
                        </security>
                    </binding>
                </wsHttpBinding>
            </bindings>
            <client>
                <endpoint address="https://frank-xu2009:9009/WCFService"
                          binding="wsHttpBinding"
                          bindingConfiguration="WSHttpBinding_IWCFService"
                          contract="ClientProxy.IWCFService"
                          behaviorConfiguration="ClientBehavior"
                          name="WSHttpBinding_IWCFService" />
            </client>
        </system.serviceModel>

    提供证书就可以了。谢谢

    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
    欢迎访问老徐的中文技术博客:Welcome to My Chinese Technical Blog
    欢迎访问微软WCF中文技术论坛:Welcome to Microsoft Chinese WCF Forum
    欢迎访问微软WCF英文技术论坛:Welcome to Microsoft English WCF Forum
    2009年8月13日 9:52
    版主
  • 出现这个问题,只要把客户端的证书加入到本地计算机的信任机构就正常了

    <serviceCertificate>
                    <defaultCertificate storeName="My" 
                                        x509FindType="FindBySubjectName"
                                        findValue="WCFServerPK"
                                        storeLocation="CurrentUser"/>
                  </serviceCertificate>
    这段配置可以删除,不需要

     

    由此引出的一个问题:

    客户端证书被信任后,服务端的自定义验证方法Validate就不会被执行,不知是何因?

    2010年7月23日 7:59
  • 顶楼上,出现同样问题,顺利解决
    2010年8月25日 14:33
  • 不知道,我的webservice 是第三方的,这个证书,怎么操作?
    2011年5月20日 3:40