【问题标题】:The server has rejected the client credentials服务器已拒绝客户端凭据
【发布时间】:2011-12-20 15:16:20
【问题描述】:

我有一个带有 net.tcp 绑定的 WCF 服务,它作为 Windows 服务托管在服务器上。我无法访问此服务。但是,当我将它托管在本地网络上时,我能够做到这一点。

收到错误

消息:** 服务器已拒绝客户端凭据。

内部异常:

System.Security.Authentication.InvalidCredentialException:
The server has rejected the client credentials.
---> System.ComponentModel.Win32Exception:
The logon attempt failed --- End of inner exception stack trace
--- at System.Net.Security.NegoState.ProcessAuthentication(LazyAsyncResult lazyResult)
at System.Net.Security.NegotiateStream.AuthenticateAsClient(NetworkCredential credential, ChannelBinding binding, String targetName, ProtectionLevel requiredProtectionLevel, TokenImpersonationLevel allowedImpersonationLevel)
at System.Net.Security.NegotiateStream.AuthenticateAsClient(NetworkCredential credential, String targetName, ProtectionLevel requiredProtectionLevel, TokenImpersonationLevel allowedImpersonationLevel)
at System.ServiceModel.Channels.WindowsStreamSecurityUpgradeProvider.WindowsStreamSecurityUpgradeInitiator.OnInitiateUpgrade(Stream stream, SecurityMessageProperty& remoteSecurity)

尝试搜索解决方案,但没有找到符合我要求的解决方案,因此在此处发布。

可能是什么问题?

如果我在客户端上将安全模式设置为无

<security mode="None"></security>

我收到另一个错误:

错误:套接字连接被中止。这可能是由于处理您的消息时出错或远程主机超出接收超时,或者是潜在的网络资源问题引起的。本地套接字超时为 '00:00:59.5149722'。

【问题讨论】:

  • 您应该指定 Windows 服务在哪个帐户中运行。是系统帐户/用户帐户吗?另外,您使用哪种 WCF 身份验证?
  • Windows 服务在本地系统帐户下运行,并且没有使用 WCF 身份验证。如果您需要任何其他信息,请告诉我
  • 可能 NTLM 凭据失败。尝试以相同的客户端用户身份运行该服务。并查看:msdn.microsoft.com/en-us/library/ms730301(VS.90).aspx 匿名安全连接

标签: wcf net.tcp


【解决方案1】:

我刚刚遇到了同样的问题,试图让DMZ 中的服务器与我网络中的服务通信。为我修复它的解决方案是将以下内容添加到 app.config:

注意安全节点。

<bindings>
  <netTcpBinding>
    <binding name="customTcpBinding" maxReceivedMessageSize="20480000" transferMode="Streamed" >
      <security mode="None"></security>
    </binding>
  </netTcpBinding>
</bindings>

【讨论】:

  • 如果我在客户端将安全模式设置为无,我会收到另一个错误。“套接字连接被中止...”
  • 尝试将该节点添加到客户端和服务器配置文件中。
  • 是的,成功了。现在我可以与 WCF 服务进行通信了。但是现在我正在尝试对服务实施某种安全性...感谢并享受赏金:)
【解决方案2】:

错误是 TokenImpersonation 错误。

似乎正在发生的事情是调用进来了,服务器端的一些代码要求用户被服务器代码模拟。

服务器代码作为本地系统帐户运行,因此无法模拟域用户。

您有 2 个基本选项:

  • 在允许模拟其他用户的用户的安全上下文中运行服务
  • 重写您的应用程序以便不需要模拟

【讨论】:

    【解决方案3】:

    我知道已经用“关闭安全性”回答了这个问题。但如果有人感兴趣,我确实设法在 Intranet 环境中使用 NetTcpBinding 获得 WCF 传输 Windows 身份验证,而我自己却经历了很大的痛苦。

    基本上归结为使用此配置:

    <security mode="Transport">
      <transport clientCredentialType="Windows" />
    </security>
    

    您可以在博文中查看更多详细信息WCF Transport Windows authentication using NetTcpBinding in an Intranet environment。

    【讨论】:

    【解决方案4】:

    Ours 是一个基于 Windows 的应用程序,连接到本地 Intranet 中的 WCF 服务。安全级别已设置为 Windows 身份验证。我们偶尔会收到此错误。经过调查,我们发现 Windows 密码已过期。修改密码后,一切正常...

    如果您偶尔收到此错误,这是一个简单的检查。

    【讨论】:

    • 我们最近也遇到了这个问题,服务/应用程序A通过WCF与服务/应用程序B通信,都以用户U运行。更改用户U的密码一开始不会引起任何问题(直到您重新启动服务或应用程序池),但是 WCF 通信失败并出现问题中的错误消息。
    【解决方案5】:

    似乎客户端请求未在服务器上进行身份验证。您可以找到有用的信息here 和here。

    【讨论】:

      【解决方案6】:

      当您尝试从服务中抽取过多数据时,通常会出现“套接字连接已中止”的第二个错误。

      我建议先模拟用户以使凭据正常工作,然后再考虑问题的提醒。

      您可以在 How to: Impersonate a Client on a Service 中找到一些关于假冒的有用信息。

      【讨论】:

        【解决方案7】:

        类似于@vonbalaji,我在帐户由于多次输入错误密码而被锁定时看到了这种情况。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-06
          • 1970-01-01
          • 2012-11-15
          • 1970-01-01
          • 1970-01-01
          • 2012-01-14
          相关资源
          最近更新 更多