我可以使用Win-form应用程序连接到WCF服务,但是我无法使用Windows服务连接。每当我向代理触发open()时,它都会抛出以下错误
服务器已拒绝客户端凭据
内部异常:系统.安全.身份验证.凭证无效异常:服务器已拒绝客户端凭据。
系统运行异常:登录尝试失败
- --内部异常堆栈跟踪结束---
位于系统。网络。安全。协商状态。进程身份验证(延迟异步结果延迟结果)
位于System. Net. Security. NegotiateStream. AuthenticateAsClient(网络凭据凭据、通道绑定、字符串目标名称、所需保护级别、所允许令牌模拟级别)
位于System. Net. Security. NegotiateStream. AuthenticateAsClient(网络凭据凭据、字符串目标名称、所需保护级别保护级别、允许的令牌模拟级别模拟级别)
at系统.服务模型.通道. Windows流安全性升级提供程序. Windows流安全性升级启动程序.启动时升级(流数据流,安全性消息属性和远程安全性)
尝试寻找解决方案,但没有适合我的要求,因此张贴。
请帮帮我...
- 更新1:**
@A.R.,尝试使用
client.ClientCredentials.Windows.AllowedImpersonationLevel =
System.Security.Principal.TokenImpersonationLevel.Impersonation;
但无济于事。
- 更新2:**
WCF服务配置
<system.serviceModel>
<diagnostics performanceCounters="All" />
<bindings>
<netTcpBinding>
<binding name="myBindingForLargeData" maxReceivedMessageSize="5242880" maxConnections="10">
<readerQuotas maxDepth="64" maxStringContentLength="5242880" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
</binding>
</netTcpBinding>
</bindings>
<services>
<service behaviorConfiguration="WCFService.ServiceBehavior"
name="WCFService.CollectorService">
<endpoint address="" binding="netTcpBinding" bindingConfiguration="myBindingForLargeData"
name="netTcpEndPoint" contract="WCFService.ICollectorService" />
<endpoint address="mex" binding="mexTcpBinding" bindingConfiguration=""
name="mexTcpEndPoint" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:8010/WCFService.CollectorService/" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="WCFService.ServiceBehavior">
<serviceMetadata httpGetEnabled="False"/>
<serviceDebug includeExceptionDetailInFaults="True" />
<serviceThrottling
maxConcurrentCalls="32"
maxConcurrentSessions="32"
maxConcurrentInstances="32"
/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
5条答案
按热度按时间jpfvwuh41#
谢谢你所有的帮助。我得到了答案后,几天的一些研究和试错法:)嗯,我知道我晚了张贴答案,但我认为它比没有更好。
所以这是解决办法
我不得不在我的配置文件中做一些更改(客户端和服务器)
在客户端,我添加了
<security>
标记,如下所示还在服务器端添加了相同的标记(WCF服务配置),如下所示
希望这能帮助一个有需要的人:)
因此,关键是使客户机和服务器配置文件的
<security>
标记相同。8xiog9wr2#
基本上发生的事情是你的调用服务没有适当的凭据,就像你从WinForms调用时一样。你需要的是一些模拟。它需要一些设置,有点烦人,但它会工作。
幸运的是MSDN有一个很好的小演练。
http://msdn.microsoft.com/en-us/library/ms731090.aspx
这里有一些关于这个主题的一般信息:
http://msdn.microsoft.com/en-us/library/ms730088.aspx
仅设置模拟标志是不够的。您必须实际模拟凭据才能使其工作。例如:
brtdzjyr3#
查看我对这篇文章的回答服务器拒绝了客户端凭据。
注意安全节点。
um6iljoc4#
您在WCF服务上使用的身份验证模式是什么?似乎winform应用程序正在运行并提供正确的凭据,而您的Windows服务未使用指定的权限运行或传递的凭据无效。请尝试使用Fiddler检查从winforms与Windwos服务发出的请求,并查看差异。
9udxz4iz5#
对我来说,将两端(客户端+服务器)的安全模式设置为None很有帮助:
NetTcpBinding绑定=新建的NetTcpBinding();绑定安全模式=安全模式无;
(Same答案与spinner_den_g相同,但使用C# -无需编辑app.config)