【问题标题】:Using STS and WCF having issue with unsecured or incorrectly secured fault exception使用 STS 和 WCF 时遇到不安全或不正确安全的故障异常问题
【发布时间】:2013-12-18 00:01:15
【问题描述】:

我正在处理几个使用 WIF 和 STS 提供程序保护的 WCF 服务(全部使用开箱即用的 Microsoft 代码和示例)。这些服务都是使用 .NET 3.5 构建的,并且最近都更新到了 .NET 4.0。 ALL 与服务相关的 .dll 也已更新到 4.0。这些服务多年来一直按原样工作,直到我更新了框架版本。

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

从对方收到不安全或不正确安全的故障 派对。故障代码和细节见内部FaultException。

HResult -2146233087

{"处理安全令牌时发生错误 消息。”}

服务器堆栈跟踪:在 System.ServiceModel.Channels.SecurityChannelFactory1.SecurityRequestChannel.ProcessReply(Message reply, SecurityProtocolCorrelationState correlationState, TimeSpan timeout) at System.ServiceModel.Channels.SecurityChannelFactory1.SecurityRequestChannel.Request(消息 消息,TimeSpan 超时)在 System.ServiceModel.Security.SecuritySessionSecurityTokenProvider.DoOperation(SecuritySessionOperation 操作、EndpointAddress 目标、Uri via、SecurityToken currentToken,TimeSpan 超时)在 System.ServiceModel.Security.SecuritySessionSecurityTokenProvider.GetTokenCore(时间跨度 超时)在 System.IdentityModel.Selectors.SecurityTokenProvider.GetToken(时间跨度 超时)在 System.ServiceModel.Security.SecuritySessionClientSettings`1.ClientSecuritySessionChannel.OnOpen(TimeSpan 超时)在 System.ServiceModel.Channels.CommunicationObject.Open(时间跨度 超时)在 System.ServiceModel.Channels.ServiceChannel.OnOpen(TimeSpan 超时)
在 System.ServiceModel.Channels.CommunicationObject.Open(时间跨度 超时)在 System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.Call(ServiceChannel 通道,TimeSpan 超时)在 System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(时间跨度 超时,CallOnceManager 级联)在 System.ServiceModel.Channels.ServiceChannel.EnsureOpened(时间跨度 超时)在 System.ServiceModel.Channels.ServiceChannel.Call(字符串 action, Boolean oneway, ProxyOperationRuntime 操作, Object[] ins, Object[] 出局,TimeSpan 超时)在 System.ServiceModel.Channels.ServiceChannel.Call(字符串动作, Boolean oneway, ProxyOperationRuntime 操作, Object[] ins, 对象 [] 出局)在 System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall,ProxyOperationRuntime 操作)在 System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage 留言)

在 [0] 处重新抛出异常:在 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg,IMessage retMsg)在 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(消息数据& msgData,Int32 类型)在 MyProject.IMyService.GetInfo() 在 MyProject.Proxy.GetInfo() 中 c:\Projects\Proxy.cs:行 36

深入挖掘它也表明:

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

所以我查看了以下内容,这些都表明系统上的时钟存在问题,但没有一个有效:

http://blogs.msdn.com/b/dhrubach/archive/2009/12/14/9936037.aspx
An unsecured or incorrectly secured fault was received from the other party.(When working with SAML )
http://blogs.msdn.com/b/xiaowen/archive/2009/03/26/tip-add-a-clock-skew-to-prevent-some-security-faults.aspx?Redirected=true

我已附加到这些服务中的调试器并尝试遍历代码,但找不到罪魁祸首。有谁知道我可能对此有什么不妥?

编辑: 有趣的是在 STS 服务中 WIF 的 困难 部分进行身份验证有效! 我已打开日志记录并捕获以下内容:

Service authorization succeeded.  
Service: http:// localhost:4068 /MyID/MyID.svc  
Action: http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue  
ClientIdentity: Domain\allen; 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 被集成到框架中。

所以所有的授权都有效,只是我认为客户端接受令牌存在问题?

【问题讨论】:

  • 我看到这个问题有 1 个赞成票和 1 个反对票。请提供反馈,以便在否决时可以改进问题。我试图提供尽可能多的信息。
  • 您并没有真正提供太多,请显示代码您在代码和 web.config 中的安全设置。我可以从异常堆栈中看到,在 WCF 端处理安全令牌期间出现了问题。
  • 只是一个想法,但您可以尝试在 ssl 端点上公开客户端吗?

标签: wcf wif sts-securitytokenservice


【解决方案1】:

首先,你的追踪选项在哪里?仅跟踪 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

【讨论】:

  • 我试图追踪Microsoft.IdentityModel,但它什么也没返回。有没有办法追踪一切(即使它真的很健谈)只是为了找到一切而不是猜测?我为name="*" 尝试了*,但没有成功。
  • 我认为您不能像在 java 上那样只启用所有应用程序的跟踪(如图),但至少您应该包括 System.IdentityModel、System.ServiceModel、System.ServiceModel.Activation 和 System .ServiceModel.MessageLogging.
  • System.ServiceModel 日志中,我看到一个异常,指出以下内容:安全处理器无法在消息中找到安全标头。这可能是因为消息是不安全的错误,或者是因为通信双方之间存在绑定不匹配。如果服务配置了安全性并且客户端未使用安全性,则可能会发生这种情况。 随后会出现“警告”,说明:安全协议无法验证传入消息。我开始研究但无济于事。这听起来像根本问题吗?
  • 另一条评论 - 请记住,这在 .NET 3.5 中工作了多年,因此 IMO 不太可能凭空出现不匹配的绑定。
  • 您是否 100% 确定客户端和服务器端点匹配,我的意思是。服务合同和数据合同。我假设绑定匹配,否则你会遇到其他错误。但是,您确定 Service 和 DataContracts 匹配吗?
【解决方案2】:

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

由于两者的类名相同,可能是客户端从“错误”版本的框架运行代码。

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

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

【讨论】:

  • 问题是当 WIF 集成到框架中时,我的目标是 .NET 4.0 而 not 4.5。因此 3.5 或 4.0 的 WIF 使用相同的方法来实现。该链接涉及从 3.5 到 4.5 更改的问题。或者像我一样在使用 .NET 4.0 时可以应用这方面的其他东西吗?
猜你喜欢
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
  • 1970-01-01
相关资源
最近更新 更多