【问题标题】:How secure is WCF wsHttpBinding's Windows authentication?WCF wsHttpBinding 的 Windows 身份验证有多安全?
【发布时间】:2010-05-25 16:54:02
【问题描述】:

我创建了 WCF,并使用 wsHttpBinding 和 MTOM 作为消息传输,身份验证为“Windows”。

现在我的服务不是当前的 SECURE,它是纯 HTTP,在自定义端口上运行。

WCF 的 wsHttpBinding 的 Windows 身份验证是否安全?任何人都可以通过网络跟踪看到密码或猜测吗?

环境信息:

  1. 在 Internet 上托管
  2. 没有 Active Directory,只有一个服务器
  3. 使用服务器的管理员用户名和密码从我的办公室连接
  4. 在客户端,配置文件中没有提到密码,它是在运行时输入的。它可以正常工作,因为输入错误的凭据也会返回某种安全异常。
  5. 在自定义端口 89 上运行 .NET 4.0,目前我在自定义 Windows 服务的 app.config 中设置了以下配置,我将 WCF 托管在作为本地服务安装的自定义 Windows 服务中。我已在每种方法上启用了模拟。

这里是 app.config

  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="metaAndErrors">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
          <serviceAuthorization impersonateCallerForAllOperations="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <services>
      <service name="CustomServiceHost.CustomService"
               behaviorConfiguration="metaAndErrors"
               >
            <endpoint address="" binding="wsHttpBinding"
                  bindingConfiguration="wsHttpLargeBinding"
                  contract="CustomServiceHost.ICustomService"/>
        <endpoint address="mex" binding="mexHttpBinding"
                  contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:89/CustomService" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <bindings>
      <wsHttpBinding>
        <binding
          name="wsHttpLargeBinding" messageEncoding="Mtom"
          maxReceivedMessageSize="2147483647">
          <readerQuotas maxArrayLength="512000"/>
        </binding>
      </wsHttpBinding>
    </bindings>
  </system.serviceModel>

以下是在运行时完成的客户端配置,

        WSHttpBinding binding = new WSHttpBinding();

        binding.Security.Message.ClientCredentialType 
            = MessageCredentialType.Windows;
        binding.Security.Mode = SecurityMode.Message;

        binding.MessageEncoding = WSMessageEncoding.Mtom;

        binding.ReaderQuotas.MaxArrayLength = 512000;

        CustomServiceClient cc = new CustomServiceClient(
            binding,
            new EndpointAddress(string.Format(
                "http://{0}:89/CustomService", 
                host.ServerHost))
            );

        cc.ClientCredentials.Windows.AllowedImpersonationLevel 
            = System.Security.Principal.TokenImpersonationLevel.Impersonation; 
        cc.ClientCredentials.Windows.ClientCredential 
            = new NetworkCredential(host.Username, host.Password);

谢谢你, - 阿卡什

【问题讨论】:

  • wsHttpBinding 有默认加密的消息。你在说什么密码?
  • 您能否在问题中添加有关您的环境的更多信息?您的应用程序是在 Intranet 还是 Internet 环境中运行?您的网络中是否有 Active Directory 等?您使用哪个版本的 .NET?
  • 有完整源代码示例的最终解决方案吗?

标签: .net windows wcf wcf-binding wcf-security


【解决方案1】:

关于您关于密码的问题:Windows 身份验证使用 Kerberos 或 NTLM,并且这两种协议都没有以明文形式传输密码。

此信息写在这里: http://msdn.microsoft.com/en-us/library/ff647076.aspx

您应该使用集成 Windows 身份验证而不是基本身份验证,因为它可以避免通过网络传输用户凭据。

这意味着您不需要 SSL 来保护您的密码,但如果您有其他敏感信息(在您的服务调用中),那么您应该考虑使用加密(例如 SSL)。我没有尝试过,但它应该可以帮助您入门:

http://www.codeproject.com/KB/WCF/WCFSSL.aspx

另一种选择是加密消息(消息安全而不是传输安全)。这是另一个可以帮助您入门的链接:

http://msdn.microsoft.com/en-us/library/ms733137.aspx

【讨论】:

  • 我不明白你的最后一部分,我唯一担心的是没有人应该看到明文密码,其余的没有什么敏感的,我了解加密和 ssl,我将来可能会这样做,但现在我关心的只是明文密码,谢谢你的回答,我正在使用 SecurityMode.Message,如果我使用 Windows 集成身份验证就足够了吗?
  • SSL 是您用来实现 http 通道传输安全的工具。使用消息安全意味着您发送的所有内容都会被加密。这与 NTLM 或 Kerberos 无关,这两种协议从不以纯文本形式交换密码。
  • 我希望用户输入他们正在连接的服务器的凭据,他们的本地 Windows 用户没有用,因为他们正在连接的服务器是远程工作组服务器,(无域)和(无关系)。就好像 SERVER 是 hotmail.com 而客户端是你的 Outlook,你需要设置一个帐户并使用凭据连接到 SERVER。
【解决方案2】:

首先我在&lt;binding&gt; 下找不到子元素

<security mode="Message">
    <message clientCredentialType="Windows" />
</security>

您应该将其插入web.config(或App.config)。它将对应客户端当前使用的消息安全模式。

而且有点奇怪,我发现你没有在 IIS 服务器下托管 WCF 服务。使用作为本地服务安装的自定义 Windows 服务确实不是安全解决方案的最佳选择。它是您的最终配置还是您计划在 IIS 下托管它?如果这是一个未解决的问题,我可以向您发布一些链接,其中描述了不同托管方式的优缺点。在LocalSystem 帐户下运行 WCF 服务是否有一些重要要求?您能否简要介绍一下 WCF 服务的作用?我有问题建议您对服务器端进行过多限制,这可能会使 WCF 的主要工作变得不可能。另一方面遵循最小权限原则以获得更安全的解决方案。

这还不是最终答案,只是第一句话。

已更新:您好!现在我有时间结束我的回答了。首先,我想确认像 Stefan Egli(见另一个答案)我敢肯定,密码不会以明文形式发送。我只是不确定 Windows 身份验证是如何工作的,因为您没有 Active Directory。可能它与本地服务器帐户一起用作 NTLM 身份验证。小问题是仅当您使用此 NTLM 时,您无法在客户端确定您是否真的与您的 WCF 服务器一起工作。在这种情况下,证书的使用非常有帮助。

Stefan Egli 在他的回答中也提出了一种方法,即 SSL。它不仅可以进行数据加密,还可以使用 SSL 证书对服务器进行身份验证。如果您选择将消息模式更改为 TransportWithMessageCredential 的方式。

如果您进行远程管理的客户端计算机不是免费的非托管客户端,并且您能够在计算机上安装一些组件,我强烈建议您使用基于证书的身份验证和数据加密(请参阅@987654321 @) 并在服务器端和客户端安装相应的证书。这种方式是最安全的,实施后您将同时收到客户端和服务器的身份验证和加密。

http://www.codeproject.com/KB/WCF/9StepsWCF.aspx 下,您将逐步了解如何在 WCF 中创建和使用客户端和服务器证书。我只想提一下,可以使用 Windows SDK 中的 MakeCert.exe 实用程序不仅可以创建自签名证书,还可以创建小型 PKI。这是一个例子:

MakeCert.exe -pe -ss MY -a sha1 -cy authority -len 4096 -e 12/31/2020 -r 
             -n "CN=My Company Root Authority,O=My Company,C=DE" MyCompany.cer

您创建一个“根”“自签名”证书并保存在我的(个人)证书存储中(关于 -sv 开关的替代方案,您可以将私钥保存在 PVK 文件中)。您还可以将其导出到 MyCompany.cer(但没有私钥),以便更轻松地将其安装在 Truster Root 中的客户端和服务器计算机上。然后您可以创建另外两个证书:一个用于服务器,另一个用于客户端身份验证,使用根证书对这两个证书进行签名。您可以做与拥有像 http://www.codeproject.com/KB/WCF/wcf_certificates.aspx 这样的证书服务器(证书服务)完全相同的事情

有关其他示例,请参阅例如 http://blogs.microsoft.co.il/blogs/applisec/archive/2008/04/08/creating-x-509-certificates-using-makecert-exe.aspx

其他链接很重要 http://msdn.microsoft.com/en-us/library/cc949011.aspx,来自http://msdn.microsoft.com/en-us/library/ff648902.aspx 的“指南文章” http://msdn.microsoft.com/en-us/library/ff650794.aspx 可以为您提供帮助。 文章http://msdn.microsoft.com/en-us/library/ms789011.aspx如何在客户端代码中做一些事情(就像你现在做的那样)。

【讨论】:

  • 这个服务本身控制着 IIS,它对托管在 IIS 中的网站进行远程管理,所以它不能托管在 IIS 中,因为在 IIS 中发生任何更改时,该进程会抛出 Thread Abort Exception 和一切都停止了,所以是的,最终设计需要它作为一个独立的 Windows 服务。这就是我使用模拟的原因,因此任何资源访问都在模拟中由运行时提供的凭据自动控制。我的问题是,如果这不是托管在 SSL 中,这是否安全,或者我必须找到一种方法在 Windows 服务中使用 SSL 托管 WCF。
  • 感谢您的更新,还有很多事情要经历,我会详细研究并发表新评论。
  • @Stefan Egli:我总是受到人们的尊重,他们投票给其他答案。真的可以相信他们!谢谢斯特凡!因为我发现我的答案并不完美,而且您的信息也非常有用,所以我也给您 +1 分。
  • 希望我可以选择多个答案,但是不允许,但是感谢您的 cmets 和 +1 为我提供 SSL 链接,真的很有帮助,msdn 没有太多 WCF 示例,所以它很少在不了解底层系统的情况下很难尝试。
  • @Akash Kava:不过,如果可能的话,我会继续推荐您尝试使用客户端和服务器证书而不是 SSL,以在您的解决方案中获得最佳安全性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
  • 1970-01-01
  • 2010-11-04
相关资源
最近更新 更多