服务器已拒绝客户端凭据

时间:2011-12-20 15:16:20

标签: wcf net.tcp

我有一个带有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'。

7 个答案:

答案 0 :(得分:26)

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

请注意安全节点。

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

答案 1 :(得分:6)

错误是TokenImpersonation错误。

似乎正在发生的是呼叫进入,服务器端的某些代码要求用户冒充服务器代码。

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

您有两个基本选项:

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

答案 2 :(得分:3)

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

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

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

您可以在博客文章 WCF Transport Windows authentication using NetTcpBinding in an Intranet environment 中看到更多细节。

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

我建议用户模拟首先获取凭据,然后考虑提醒问题。

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

答案 6 :(得分:0)

类似于@vonbalaji,当由于多次错误输入密码而将帐户锁定时,我已经看到了这一点。