文章目录
- [第四十一章 创建安全对话 - 使用 <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
属性设置为空字符串。