# 3.7.3.2 会话机构规则

当会话机构接受到\<LogoutRequest>消息时，会话机构必须认证消息的发送者。如果发送者是那个会话机构此前为其提供了包含针对当前会话的认证声明的断言的会话参与方，

如果发送方是会话参与者，且会话机构此前向其提供了包含当前会话认证声明的断言，那么会话机构应该按照指定的顺序执行以下操作:

* 向此会话机构代理过主体认证的任何会话机构发送\<LogoutRequest>消息，除非第二个机构是\<LogoutRequest>消息的发起方。
* 向此会话机构在当前会话中提供过断言的每一个会话参与方发送\<LogoutRequest>消息，\<LogoutRequest>消息的发起方除外。
* 终止由\<saml:BaseID>、\<saml:NameID>或\<saml:EncryptedID>等元素指定的主体当前对应的会话，以及终止注销请求消息中存在的任何\<SessionIndex>元素对应的会话。

如果会话机构成功地终止了主体与自身相关的会话，那么它就必须对原始请求方进行响应，响应的方式是返回一个\<LogoutResponse>消息，该消息包含一个值为`urn:oasis:names:tc:SAML:2.0:status:Success`的顶级StatusCode。否则的话，它就必须使用其中包含提示错误信息的顶级StatusCode的\<LogoutResponse>消息进行响应。因此，顶层StatusCode仅仅用于提示会话机构本身有关的注销操作的状态。

会话机构应该尝试使用任何适用/可用的协议绑定来联系每个会话参与者，即使其中一次或多次尝试失败或无法尝试（例如，因为原始请求是使用不允许将注销传播给所有参与者的协议绑定进行的）。

如果不是所有会话参与者都能成功地响应这些\<LogoutRequest>消息（或者，如果不是所有参与者都可以被联系），那么会话机构就必须在它的\<LogoutResponse>消息中引入一个值为`urn:oasis:names:tc:SAML:2.0:status:PartialLogout`的二级StatusCode，以提示并非所有其他会话参与者都成功地用注销确认进行了响应。

注意，除了从会话参与方处收到\<LogoutRequest>，会话机构可能会出于其他原因发起注销，这些原因包括但不限于：

* 如果与单个会话参与者在带外约定了某个超时时间，那么会话机构可能会向该单个会话参与者发送\<LogoutRequest>消息。
* 已超过约定的全局超时时间。
* 主体或某些其他受信任实体已直接在会话机构中请求注销主体。
* 会话机构已确定主体的凭据可能已被泄露。

当构造一个注销请求消息的时候，会话机构必须将消息的`NotOnOrAfter`属性的值设置为时间值，以指定消息的过期时间，在该时间之后，注销请求可以被接受者丢弃。此值应设置为一个时间值，该值等于或大于最近作为目标会话（如注销请求上的SessionIndex属性所示）的一部分发布的断言中指定的任何`NotOnOrAfter`属性的值。

除了第3.6.3节中针对`Reason`属性规定的值外，以下值可供且仅可供会话机构使用：

* urn:oasis:names:tc:SAML:2.0:logout:global-timeout

指定消息被发送是因为已经超过了全局会话超时时间间隔。

* urn:oasis:names:tc:SAML:2.0:logout:sp-timeout

指定消息被发送是因为已超过会话参与者和会话机构之间约定的超时时间间隔。
