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

时间:2013-05-15 22:07:06

标签: .net wcf wshttpbinding

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

由于我需要会话信息,因此我使用wsHttpBinding

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

现在它告诉我:

  

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

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

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

我的猜测是令牌过期的原因很明显,我已经杀死并重启了服务。

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

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

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

我尝试过的事情:

  • 我尝试过类似于Here

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

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

这并没有消除这个问题。

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

4 个答案:

答案 0 :(得分:11)

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

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

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

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

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

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

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

注意:在制作时,您永远不会有这种情况,因为您的服务将始终处于启动状态。

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

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

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

答案 1 :(得分:4)

wsHttpBinding具有安全性enabled by default。 尝试在绑定配置上使用此功能来禁用安全性:

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

另外,你的错误是wsHttpBinding相关。如果您使用会话并重新启动服务器,请reported security error message will appear

根据MSDN

  

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

  

可靠会话在发送方和接收方SOAP之间   端点,无论所需的传输连接数量   他们之间的连接。简而言之,TCP可靠性在哪里结束   传输连接结束,而可靠的会话提供   端到端的可靠性。

听起来像预期的行为。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

安全模式无人应该完成这项任务。

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

不要忘记在您的终端上应用bindingConfiguration="WsEventLogBinding"