.net 如何:具有传输安全性的WCF+;服务器证书验证。没有客户证书?

.net 如何:具有传输安全性的WCF+;服务器证书验证。没有客户证书?,.net,wcf,ssl,wcf-security,x509,.net,Wcf,Ssl,Wcf Security,X509,我的理解正确吗?WCF服务可以通过“传输安全性”、“证书身份验证”和设置,而不需要在客户端安装“客户端证书” 我的设想是: 远程服务器上的WCF服务 Windows窗体客户端可能会提供给数百个用户(对用户进行身份验证(针对DB)并通过WCF服务方法执行操作) 我希望我的消息通过SSL加密,这就是我选择“传输”方法的原因,我相信我也需要服务器证书的原因 我已经完成了一个演练,该演练提供了上述所有内容,但包括安装客户端证书的必要性?如果我将此windows窗体应用程序发送给客户端,如果我被迫要求

我的理解正确吗?WCF服务可以通过“传输安全性”、“证书身份验证”和设置,而不需要在客户端安装“客户端证书”

我的设想是:

  • 远程服务器上的WCF服务
  • Windows窗体客户端可能会提供给数百个用户(对用户进行身份验证(针对DB)并通过WCF服务方法执行操作)
我希望我的消息通过SSL加密,这就是我选择“传输”方法的原因,我相信我也需要服务器证书的原因

我已经完成了一个演练,该演练提供了上述所有内容,但包括安装客户端证书的必要性?如果我将此windows窗体应用程序发送给客户端,如果我被迫要求,客户端如何安装证书?看起来我真的错过了一个要点,因为我认为在用户机器上安装证书是一个很大的要求


附:从我的现状来看,我是否过度复杂了手头的工作?我是否只需要将SSL证书安装到我们的web服务器中,然后通过HTTPS访问WCF服务,并且可能只需要使用basicHttpBinding?实际上不需要担心“证书身份验证”机制?

您不需要客户端证书,它只是ssl。如果您使用IIS托管服务,这是一个不需要动脑筋的问题,只需安装证书。消息级别的安全性get有点棘手,但您应该可以使用ssl证书


如果使用basicHttpBinding,则不需要关闭身份验证,默认情况下,WSHttpBinding打开消息级身份验证,您可以在web配置中将身份验证模式(我相信)设置为“无”来关闭消息级身份验证。如果您只需要ssl,请使用basic。如果您需要ssl和Windows身份验证,那么就使用WSHttpBinding。

正如Joshua所说,如果您要使用用户名对客户端进行身份验证,则不需要客户端证书。在这种情况下,客户端传递用户名和密码,服务器提供用于相互身份验证/握手过程的证书

我最近刚刚为一个类似的系统(win forms over www)设置了一个wcf安全系统,我使用了来自的指南,它提供了一个逐步检查列表,以帮助确保您将所有内容都准备就绪。您不必遵循每一步,例如,我们没有使用角色功能,但我们使用的是会员商店

以下是使用用户名和服务器证书设置/配置wsHttpBinding的简要摘要:

客户端配置:

      <security mode="Message">
        <message clientCredentialType="UserName" negotiateServiceCredential="true"
          algorithmSuite="Default" establishSecurityContext="false" />
      </security>
服务器配置:

  • 绑定:

            <wsHttpBinding>
            <binding name="MyApp.wsHttpBindingMessageUname">
                <security mode="Message">
                    <message clientCredentialType="UserName" negotiateServiceCredential="true"
                      establishSecurityContext="false" />
                </security>
            </binding>
            </wsHttpBinding>
    
    
    
  • 行为:

            <serviceBehaviors>
            <behavior name="MyApp.DefaultServiceBehavior">
                <serviceCredentials>
                    <serviceCertificate findValue="localhost" storeLocation="LocalMachine"
                     storeName="My" x509FindType="FindBySubjectName" />
                    <userNameAuthentication userNamePasswordValidationMode="MembershipProvider"
                     membershipProviderName="AspNetSqlMembershipProvider" />
                </serviceCredentials>
            </behavior>
        </serviceBehaviors>
    
    
    

希望这能对您有所帮助,如果您有任何问题,请告诉我。

好的,谢谢。我真的觉得我把它复杂化了。WCF诱使您继续声明,如果您想保护您的服务,请采用wsHttpBinding。Grrrr argh@Josh好的,我正在尝试让basicHttpBinding在没有启用SSL的情况下运行(需要注册证书)。但是,如果该服务是通过带有SSL证书的HTTPS访问的,那么该代码看起来是否正确?看起来不错。实际上,您可以像使用绑定配置一样重用您的行为。你有什么错误吗?您可能需要将其添加到绑定的安全配置中,以关闭任何客户端需求。Thnx。是的,我想我用clientCredentialType=None使它在没有SSL的情况下工作。但很高兴标准SSL看起来不错。谢谢。那是什么用户名/密码?在服务器上设置为windows身份验证的用户名/密码?或者根据db检查表单上接受的自定义用户名/密码?在我们的场景中,我们使用了aspnet成员身份,因此在服务器配置中,我们有一个块,用于定义成员身份提供程序、db的连接字符串以及其他设置。这使WCF知道在何处根据验证凭据。
        <serviceBehaviors>
        <behavior name="MyApp.DefaultServiceBehavior">
            <serviceCredentials>
                <serviceCertificate findValue="localhost" storeLocation="LocalMachine"
                 storeName="My" x509FindType="FindBySubjectName" />
                <userNameAuthentication userNamePasswordValidationMode="MembershipProvider"
                 membershipProviderName="AspNetSqlMembershipProvider" />
            </serviceCredentials>
        </behavior>
    </serviceBehaviors>