繁体   English   中英

调试重新启动后运行时,“安全上下文令牌无效或过期”

[英]“Invalid or expired security context token” when running after a debugging restart

我有一个我正在编码的WCF应用程序。 当我改变事物然后再次运行服务调用时,我会多次启动和停止它。

由于我需要会话信息,我使用的是wsHttpBinding

在我转移到wsHttpBinding之前,我使用的是basicHttpBinding ,我可以停止服务,进行更改并重新启动它。 然后我可以针对端点运行我的WCF测试客户端(WCF Storm),它仍然可以正常运行。

现在它告诉我:

邮件无法处理。 这很可能是因为“ http://tempuri.org/IMyService/MyOperation ”操作不正确,或者因为邮件包含无效或过期的安全上下文令牌,或者因为绑定之间存在不匹配。 如果服务因不活动而中止通道,则安全上下文令牌将无效。 要防止服务中止空闲会话,请过早增加服务端点绑定的接收超时。

这意味着我必须刷新我的连接并重新设置我的服务调用(几百次后会变得烦人。)。

我读到安全超时是10分钟。 我在不到2分钟内重新开始跑步,所以我认为这不是一个超时问题。

我的猜测是令牌因为我杀死并重新启动服务的明显原因而到期。

问题是我根本不需要安全的东西 (我只需要会话的东西或者我会使用BasicHttpBinding

反正有没有让我的WCF服务不关心安全上下文令牌?

注意:我的测试客户端默认为wsHttpBinding并具有安全性设置。 但我认为这是设置这个因为我的服务是发布它需要安全性。

我尝试过的事情:

  • 我尝试过类似于我在这里找到的配置

     <bindings> <wsHttpBinding> <binding name="WsEventLogBinding"> <security mode="Message"> <message establishSecurityContext="false" /> </security> </binding> </wsHttpBinding> </bindings> 

但我真的不知道这意味着什么,或者它是否是我需要的东西(根本没有安全性(现在))。

这并没有消除这个问题。

  • 设置<security mode="None">这没有帮助。

首先,你是真的:由于HTTP协议的无连接/无状态特性,basicHttpBinding不支持这一点。

但我认为你的WCF理解存在问题。

Session是WCF中的通用概念。 它可以是基于安全性的会话 ,其中通信的两端已经就特定的安全会话或可实现的会话达成一致,其中消息可以被配置为按顺序并且恰好一次传送,从而确保即使消息在多个消息中传送也可以接收消息对话期间的节点。

两种模式都允许您选择InstanceContextMode.PerSession。 这真的是你想要的吗?

WCF安全依赖于相互身份验证; 如果双方都信任对方的凭证(基于声明),则可以建立安全上下文,其中所有消息在机密性中交换,并且所有消息都被签名以保护其完整性。 安全会话是唯一的 ,您不能在另一个对话中重复使用它。

以下是您的上下文的问题:问题不在服务器端,而是在客户端 因为必须在客户端和服务上保留某些东西,重建服务将刷新服务上的整个WCF上下文(所有实例和会话都将被处理)。没有与WCF会话相关联的通用数据存储(与asp的一个区别)。 net session),所以重启会掉落一切。 但是,客户端仍然认为由于其“无效”上下文而被认证。

要解决此问题,默认Wcf测试客户端上有此方案的复选框:“启动新代理”。 在WCf Storm中,在引擎盖/杂项“总是创建新代理”中有一个通用配置。

注意:在生产中,您将永远不会拥有此方案,因为您的服务将始终处于运行状态。

如果您关注我,您可能想尝试可靠的会话。 你可以测试,但我不确定这是否有效。

<wsHttpBinding>
    <binding name="wsHttpBindingConfiguration">
        <security mode="None" />
        <reliableSession enabled="true" />
    </binding>
</wsHttpBinding>

重要说明 :我不知道您的WCF级别,但在WCF中,客户端和服务必须具有同步配置(相同的安全性,会话设置......)

wsHttpBinding 默认启用安全性。 尝试在绑定配置上使用此选项来禁用安全性:

<security mode="None">
   <transport clientCredentialType="None" />
    <message establishSecurityContext="false" />
</security>

另外,你的错误是wsHttpBinding相关。 如果使用会话并重新启动服务器, 则会显示报告的安全错误消息

根据MSDN

可靠的会话实现WS-ReliableMessaging协议和内存中传输窗口,以屏蔽SOAP消息级故障,并在传输失败的情况下重新建立连接。

可靠会话在发送方和接收方SOAP端点之间,而不管它们之间的连接所需的传输连接数。 简而言之,TCP可靠性在传输连接结束的地方结束,而可靠的会话提供端到端的可靠性。

听起来像预期的行为。

您可以使用基本的http绑定与TransportCredentialOnly security mode

安全模式无应该做的工作。

<bindings>
    <wsHttpBinding>
        <binding name="WsEventLogBinding">
            <security mode="None" />
         </binding>
    </wsHttpBinding>
</bindings>

别忘了在端点上应用bindingConfiguration="WsEventLogBinding"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM