c# - 没有证书的 TransportWithMessageCredential 对于 WCF 服务是否足够安全?

标签 c# .net wcf web-services security

我开发了一个 WCF 自托管服务,我有两个基本的安全要求,因为它将通过 Internet 访问:

  • 传输层应防止篡改和嗅探,尤其是身份验证凭据的检索。这就是 SSL 的作用,但据我所知,设置 SSL 需要安装证书(可能通过使用普通证书文件的 this hack 除外),我宁愿不必这样做。

  • 身份验证层应包含用户名/密码验证器。

我将我的服务配置为使用:

      <security mode="TransportWithMessageCredential">
        <message clientCredentialType="UserName" />
        <transport clientCredentialType="Basic" />
      </security>

即使传输层是 HTTP(不是 HTTPS),这是否会让 WCF 创建另一个等同于 SSL 的安全层?如果不是,在安全强度方面有何不同?

此外,有没有什么方法可以在不使用 SSL 证书的情况下保护元数据端点(不是必需的,但我们将不胜感激)?

这是我的自托管服务的完整配置代码:

<?xml version="1.0"?>
<configuration>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup>
  <system.serviceModel>
    <services>
      <service name="MyService">
        <host>
          <baseAddresses>
            <add baseAddress = "http://localhost:8000/Services" />
          </baseAddresses>
        </host>
        <endpoint address ="MyService" binding="wsHttpBinding" contract="IMyService">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <bindings>
      <wsHttpBinding>
        <binding name="Binding1" maxReceivedMessageSize="2147483647">
          <security mode="TransportWithMessageCredential">
            <message clientCredentialType="UserName" />
            <transport clientCredentialType="Basic" />
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True"/>
          <serviceCredentials>
            <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="CR.Common.Services.CustomValidator, Common" />
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

谢谢!

最佳答案

默认情况下,所有安全 WCF 绑定(bind)(如 wsHttpBinding)都会对消息进行加密和签名。

SSL 强制使用证书,您提供的链接中的 hack 是 hacking wcf,而不是 SSL。因为在没有 SSL 的情况下,WCF 禁止使用 basicHttpBinding(以明文形式发送 xml)和 UserNamePasswordValidator,因为在这种情况下,拦截消息的任何人都可以获得用户名/密码。

使用 WSHttpBinding,您可以避免使用 SSL 并将安全性置于消息级别。

我强烈建议您阅读 this article ,尤其是Service Credentials and Negotiation章节:

To support mutual authentication and message protection, services must provide credentials to the caller. When transport security is used (SSL), service credentials are negotiated through the transport protocol. Service credentials for message security can also be negotiated when Windows credentials are used; otherwise a service certificate must be specified

对于 UserNamePasswordValidator,您必须在服务器上配置证书以允许客户端对每条消息进行签名和加密(使用证书的公钥)。 如果您使用的是 Windows 身份验证,则不需要。

你为什么这么担心证书?

关于c# - 没有证书的 TransportWithMessageCredential 对于 WCF 服务是否足够安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10696303/

相关文章:

c# - 什么是 WCF 中的已知类型

WCF 构建基于 SOAP 的服务

c# - ASP.NET C# MVC 将值从 Controller 传递到 cshtml

c# - 为什么 AddMonths() 在我的 DateTime 上不起作用? (见代码)

c# - 从 DotPeek(或等价物)重新创建解决方案/项目?

c# - 关于两种不同类扩展模式的问题

c# - 阿拉伯语变成奇怪的问号

wcf - 如何为生成的 WCF 代理类创建 IntelliSense 兼容文档?

javascript - 如何在中继器内隐藏/显示?

c# - 从 C# 调用 JavaScript 时出现错误 UnathorizedException