文章目录
- [第四十一章 创建安全对话 - 使用 <SecurityContextToken>](#第四十一章 创建安全对话 - 使用 <SecurityContextToken>)
- 结束安全对话
第四十一章 创建安全对话 - 使用
在 Web 服务使用 <SecurityContextToken>, 做出响应后,客户端实例和服务实例可以访问相同的对称密钥。有关此密钥的信息包含在两个实例的 SecurityContextToken 属性中。建议的程序如下:
- 在客户端中,将
SecurityOut属性设置为null,以删除请求消息中使用的安全标头。
在 Web 服务中不需要这样做,因为 Web 服务会在每次调用后自动清除安全标头。
- (可选)将
<SecurityContextToken>添加到WS-Security标头元素。为此,请调用Web客户端或Web服务的SecurityOut属性的AddSecurityElement()方法。例如:
java
set SCT=..SecurityContextToken
do ..SecurityOut.AddSecurityElement(SCT)
如果在下一步创建派生密钥令牌时使用 $$$SOAPWSReferenceSCT 引用选项,则此步骤是必需的。否则,此步骤不是必需的。
- 根据
<SecurityContextToken>创建一个新的<DerivedKeyToken>。为此,调用%SOAP.WSSC.DerivedKeyToken的Create()方法,如下所示:
java
set dkenc=##class(%SOAP.WSSC.DerivedKeyToken).Create(SCT,refOpt)
在这种情况下,必须指定 Create() 的第一个参数,并且 refOpt 必须是以下参考值之一:
$$$SOAPWSReferenceSCT(本地引用)--- 引用的URI属性以#开头,指向<SecurityContextToken>元素的wsu:Id值,该值必须包含在消息中。$$$SOAPWSReferenceSCTIdentifier(远程引用)------引用的URI属性包含<SecurityContextToken>元素的<Identifier>值,该值不必包含在消息中。
java
set dkenc=##class(%SOAP.WSSC.DerivedKeyToken).Create(SCT,$$$SOAPWSReferenceSCT)
- 使用新的
<DerivedKeyToken>来指定安全标头。请参阅使用派生密钥令牌进行加密和签名。 - 发送
SOAP消息。请参阅添加安全标头元素中的一般注释。
java
//initiate conversation -- not shown here
//clear SecurityOut so that we can respecify the security header elements for
//the secure conversation
set client.SecurityOut=""
//get SecurityContextToken
set SCT=client.SecurityContextToken
do client.SecurityOut.AddSecurityElement(SCT)
// get derived keys
set dksig=##class(%SOAP.WSSC.DerivedKeyToken).Create(SCT,$$$SOAPWSReferenceSCT)
do client.SecurityOut.AddSecurityElement(dksig)
// create and add signature
set sig=##class(%XML.Security.Signature).Create(dksig,,$$$SOAPWSReferenceDerivedKey)
do client.SecurityOut.AddSecurityElement(sig)
//invoke web methods
结束安全对话
一旦 <SecurityContextToken> 过期,安全对话就会结束,但 Web 客户端也可以通过取消未过期的 <SecurityContextToken>来结束它。
要结束安全对话,请调用 Web 客户端的 CancelSecureConversation() 方法。例如:
java
set status=client.CancelSecureConversation()
该方法返回一个状态值。
请注意,此方法将客户端的 SecurityOut 属性设置为空字符串。