none
如何不使用证书进行客户端安全验证 RRS feed

  • 问题

  • 如题:

    客户端数量太多,用证书不方便。
    查了 “用户名和密码验证” 貌似也需要证书。
    我对WCF不熟,不知道有没有好的实现方法,最好能有个例子。谢谢。

    2016年11月10日 7:49

答案

全部回复

  • 嗨,

    对于用户名和密码验证,一般来说,在服务器端需要安装证书,在客户端是不需要安装证书的。客户端只需要提供用户名和密码就好了。 你是内网还是外网?

    如果是内网,你可以通过基本身份验证确保的传输安全.

    https://msdn.microsoft.com/zh-cn/library/ms733775(v=vs.110).aspx?f=255&MSPPError=-2147217396

    如果是外网,你可以用户名客户端的消息安全.

    https://msdn.microsoft.com/zh-cn/library/ms731058(v=vs.110).aspx

    Best Regards,

    Edward


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2016年11月11日 3:07
    版主
  • 先谢谢您的答复,但是我自己试了一下。要是客户端没有证书的话还是会报错,如下:

    “/”应用程序中的服务器错误。

    X.509 certificate CN=onServer 链生成失败。所使用的证书具有无法验证的信任链。请替换该证书或更改 certificateValidationMode。无法验证证书的签名。

    说明: 执行当前 Web 请求期间,出现未经处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 

    异常详细信息: System.IdentityModel.Tokens.SecurityTokenValidationException: X.509 certificate CN=onServer 链生成失败。所使用的证书具有无法验证的信任链。请替换该证书或更改 certificateValidationMode。无法验证证书的签名。

    这是我服务端的配置:

    <system.serviceModel>
        <services>
          <service name="WCF.MyService" behaviorConfiguration="safe-behavior">
            <endpoint address="" binding="wsHttpBinding" bindingConfiguration="Safe-wsHttpBinding" contract="WCF.IMyService"/>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
            <host>
              <baseAddresses>
                <add baseAddress="http://localhost:8001/"/>
              </baseAddresses>
            </host>
          </service>
        </services>

        <bindings>
          <wsHttpBinding>
            <binding name="Safe-wsHttpBinding">
              <security mode="Message">
                <!--<transport clientCredentialType="None"/>-->
                <message clientCredentialType ="UserName"/>
              </security>
            </binding>
          </wsHttpBinding>
        </bindings>

        <behaviors>
          <serviceBehaviors>
            <behavior name="safe-behavior">
              <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
              <serviceDebug includeExceptionDetailInFaults="false"/>
              
              <serviceCredentials>
                <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WCF.MyUserNamePasswordValidator,WCF"/>
                <serviceCertificate  findValue="onServer"
                                     storeLocation="LocalMachine" 
                                     storeName="TrustedPeople"
                                     x509FindType="FindBySubjectName"/>
              </serviceCredentials>
            </behavior>
            
          </serviceBehaviors>
        </behaviors>
        <protocolMapping>
            <add binding="basicHttpsBinding" scheme="https" />
        </protocolMapping>    
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
      </system.serviceModel>

    这是我客户端生成的配置:(黑色部分是我加的,要是不加就会报上面的错误,加了就可以正常访问)

    <system.serviceModel>
        <bindings>
          <wsHttpBinding>
            <binding name="WSHttpBinding_IMyService">
              <security>
                <message clientCredentialType="UserName" />
              </security>
            </binding>
          </wsHttpBinding>
        </bindings>
        <client>
          <endpoint address="http://localhost:51903/MyService.svc" binding="wsHttpBinding"
            bindingConfiguration="WSHttpBinding_IMyService" contract="WCF_Service.IMyService" behaviorConfiguration="endpointBehavior"
            name="WSHttpBinding_IMyService">
            <identity>
              <certificate encodedValue="AwAAAAEAAAAUAAAAtjZBTFuPSEdgA5jqIlISOAn1k14gAAAAAQAAADgCAAAwggI0MIIB4qADAgECAhDKtAUg6ZA+j0EMnnZB4mjRMAkGBSsOAwIdBQAwFjEUMBIGA1UEAxMLUm9vdCBBZ2VuY3kwHhcNMTYxMTExMDU0MDA0WhcNMzkxMjMxMjM1OTU5WjATMREwDwYDVQQDEwhvblNlcnZlcjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJZBRmzUr1xpQBvdSShEtGTxglBF3qlgi0VWGlbjeFNP8HLHvxApXLWqpRr7G+SbqtwNOfQzIvXbX2uPzUZFpRJ9c7ZSYW+0jQb5lBQFt5cTSq5kJ4lgvMwYJJbIHoZRPi+15DxwslBHgn5Uf9cNc01KQq1go7Vebc2DvMPUT9AQUvXjCepDk5+qiktofZSBKIa6E83c3i5FqpNvicZUaXNgXfq/MH5nsuLzSNs9heeTPGfUqPXIfAG+r67vteJDPx8ehtyjv84gB1D8VSlgpHlcRkairsRG0z/YizIztZ8GfoHeMKVEDCiwNxgGU47mo8pefsljMMZWfNWIDCxBPIECAwEAAaNLMEkwRwYDVR0BBEAwPoAQEuQJLQYdHU8AjWEh3BZkY6EYMBYxFDASBgNVBAMTC1Jvb3QgQWdlbmN5ghAGN2wAqgBkihHPuNSqXDX0MAkGBSsOAwIdBQADQQA+IvjOMCu56boVWFynh30NxUHlwYWj0FvJRYeTCd8rOcGOYkZFKQMQLGBNh4NXQU3anli/XBbSZfp37LuJTfts" />
            </identity>
          </endpoint>
        </client>

        <behaviors>
          <endpointBehaviors>
            <behavior name="endpointBehavior">
              <clientCredentials>
                <serviceCertificate>
                  <authentication certificateValidationMode="PeerOrChainTrust"/>
                </serviceCertificate>
              </clientCredentials>
            </behavior>
          </endpointBehaviors>
        </behaviors>
        
      </system.serviceModel>

    不知道是不是我哪儿出了问题?还请您不吝赐教,谢谢

    2016年11月11日 9:09
  • 谢谢,我试出来了,将客户端我自己加的那一段中的 "PeerOrChainTrust" 改为 "none" 即可:

    <behaviors>
          <endpointBehaviors>
            <behavior name="endpointBehavior">
              <clientCredentials>
                <serviceCertificate>
                  <authentication certificateValidationMode="none"/>
                </serviceCertificate>
              </clientCredentials>
            </behavior>
          </endpointBehaviors>
        </behaviors>

    2016年11月11日 9:19