使用STS和WCF时出现不安全或不正确保护的故障异常



我正在使用几个WCF服务,这些服务都使用WIF和STS提供程序进行保护(都使用现成的Microsoft代码和示例)。这些服务都是使用.NET 3.5构建的,最近都更新到了.NET 4.0ALL.与服务相关的dll也已更新到4.0。在我更新框架版本之前,这些服务已经按原样运行了多年。

现在的问题是,当对由STS WCF服务保护的WCF服务进行调用时,在将令牌传递回调用由STS:安全的WCF服务的客户端应用程序后会生成错误

收到来自另一方的不安全或不正确的故障聚会有关故障代码和详细信息,请参阅内部FaultException。

HResult-2146233087

{"处理中的安全令牌时出错消息"}

服务器堆栈跟踪:位于System.ServiceModel.Channels.SecurityChannelFactory 1.SecurityRequestChannel.ProcessReply(Message reply, SecurityProtocolCorrelationState correlationState, TimeSpan timeout) at System.ServiceModel.Channels.SecurityChannelFactory 1.SecurityRequestChannel.Request(消息消息,TimeSpan超时)System.ServiceModel.Security.SecuritySessionSecurityTokenProvider.DoOperation(SecuritySessionOperation操作,EndpointAddress目标,Uri通过,SecurityTokencurrentToken,TimeSpan超时)System.ServiceModel.Security.SecuritySessionSecurityTokenProvider.GetTokenCore(TimeSpan超时)System.IdentityModel.Selectors.SecurityTokenProvider.GetToken(TimeSpan超时)System.ServiceModel.Security.SecuritySessionClientSettings`1.ClientSecuritySessionChannel.OnOpen(TimeSpan超时)System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan超时)System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan超时)
在System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan超时)System.ServiceModel.Channes.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel通道,TimeSpan超时)System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(TimeSpan超时,CallOnceManager级联)System.ServiceModel.Channels.ServiceChannel.EnsureOpened(TimeSpantimeout)(字符串action,布尔单向,ProxyOperationRuntime操作,Object[]ins,Object[]out,TimeSpan超时)System.ServiceModel.Channels.ServiceChannel.Call(字符串操作,布尔单向,ProxyOperationRuntime操作,Object[]ins,对象[]out)System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessagemethodCall,ProxyOperationRuntime操作)System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage消息)

在[0]处重新引发异常:在System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessagereqMsg、IMessage retMsg)System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData&msgData,Int32类型)MyProject.IMyService.GetInfo()位于中的MyProject.Proxy.GetInfo()c: \Projects\Proxy.cs:line36

深入挖掘还显示:

InvalidSecurityToken作为InnerException.Code.Subcode.Name属性值。

因此,我查看了以下内容,这些内容都表明系统上的时钟存在问题,但都没有起作用:

http://blogs.msdn.com/b/dhrubach/archive/2009/12/14/9936037.aspx
从另一方收到无担保或担保不正确的过失。(使用SAML时)
http://blogs.msdn.com/b/xiaowen/archive/2009/03/26/tip-add-a-clock-skew-to-prevent-some-security-faults.aspx?Redirected=true

我已经连接到这些服务中的调试器,并试图遍历代码,但我找不到罪魁祸首。有人知道我可能对此有什么不妥吗?

EDIT:有趣的是STS服务中WIF的hard部分执行身份验证工作我打开了日志记录,并捕获了以下内容:

Service authorization succeeded.  
Service: http:// localhost:4068 /MyID/MyID.svc  
Action: http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue  
ClientIdentity: Domainallen; S-1-5-21-1234567890-1234567895-0987654321-45678 
AuthorizationContext: uuid-22fad22a-22fe-123c-9b69-a22c23f569ce-99 
ActivityId: <null>  
ServiceAuthorizationManager: <default>

我还打开了.config中的WCF日志来查看.svc文件,它们没有产生任何错误信息来确定问题。这就像STS说:"嘿,你已经通过了身份验证,我们传递了你并生成了令牌,现在我们完成了!"似乎调用客户端不喜欢令牌。然而,在我更改框架版本之前,这已经工作了很久。据我所知,从3.5到4.0,WIF没有任何重大变化,但在4.5中,WIF集成在框架中,发生了重大变化。

所以所有的授权都有效,只是我想客户端接受令牌有问题吗?

首先,您的跟踪选项在哪里?仅跟踪System.ServiceModel可能无法产生足够的信息。至少你应该添加System.ServiceModel.Activation,可能还有几个与WIF相关的附加组件(我会添加System.Security)

我在使用STS和将java客户端与.net服务器集成时也遇到了类似的错误。以下是我解决问题的方法。

  1. 为服务构建一个新客户端,并将其连接到服务器。使用Fiddler监控消息
  2. 对当前客户端执行相同操作
  3. 比较发送的邮件。我知道你可以从WCF跟踪日志中获得它们,但我更喜欢fiddler

我的案例将跟踪与消息检查相结合,使我能够找到错误(java客户端上的策略错误,以及服务自定义安全策略上的愚蠢代码错误)

希望这能有所帮助!

编辑

这里有一个链接,用于设置除system.servicemodel.activation之外的所有跟踪活动。可能派上用场

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

可能客户端仍然安装了两个版本的框架。

由于两者中类的名称相同,可能是客户端运行的代码来自"错误"版本的框架。

要修复它,您可以完全限定类名。

请参阅:http://msdn.microsoft.com/en-us/library/jj157089.aspx

相关内容

  • 没有找到相关文章

最新更新