在 c++ WWSAPI Web 服务中处理 WS-Security PasswordDigest 模式
Handle WS-Security PasswordDigest mode in a c++ WWSAPI web service
我继承了一个用 C++ 编写的现有且有效的 Web 服务。 我必须在 soap 标头中使用密码摘要实现基于 WS-Security 的安全机制,如下所示:
<soapenv:Header>
<wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:UsernameToken wsu:Id="UsernameToken-5094D0E1418B986BF215754539660332">
<wsse:Username>test</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">sqPh/Bap7ER6j+n+2iYlI+4Qt9A=</wsse:Password>
<wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">1ROYkV/ZftvGi17KmsvgnQ==</wsse:Nonce>
<wsu:Created>2019-12-04T10:06:06.032Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
我既不是Web服务专家也不是WWSAPI专家,但我了解Web服务的基础知识。 我试图理解 WWSAPI 文档,但不明白从哪里开始实现这种安全性。
我使用绑定WS_STRING_USERNAME_MESSAGE_SECURITY_BINDING_TYPE进行了测试,我可以为其定义密码验证器回调,这似乎适用于简单的用户/密码方案。但是在哪里/如何定义密码摘要安全机制?
使用 API,我期待一个简单的设置来定义基本的摘要机制和一个回调来接收随机数、创建日期、用户名和密码,但我不知道从哪里开始。 我不明白这是否需要简单的声明(绑定 + 属性 + 回调(,或者我是否需要编写一些代码,例如手动解析 xml 标头。
作为某人使用 WS-Security 实现 WWSAAPI Web 服务以及如何实现?
好的,所以,似乎没有人用纯 c++ 实现 Web 服务? 无论如何,我找到了答案:这必须(实际地(手工完成。 要点是:
- 必须在WS_SERVICE_POINT结构中定义授权回调
- 必须通过以下操作在此回调中读取和签入 WS 安全标头:
- 使用 WsGetOperationContextProperty 函数和参数获取输入消息(它包含标头和正文WS_OPERATION_CONTEXT_PROPERTY_INPUT_MESSAGE
- 检查消息状态是否不为空(属性 WS_MESSAGE_PROPERTY_STATE(
- 获取标头缓冲区(属性 WS_MESSAGE_PROPERTY_HEADER_BUFFER(
- 创建 XML 读取器 (WsCreateReader(
- 使用标头缓冲区初始化此读取器 (WsSetInputToBuffer(
- 解析 XML 以查找具有函数 WsGetReaderNode 的 WS-Security 标记(请参阅 WWSAPI 提供的示例(。
- 在找到的属性"mustUnderstand"的位置调用 WsMarkHeaderAsUnderstand。
- 现在 XML 已解析,您可以对 WS-Security 标记执行任何操作,以验证它们是否有效
- 在退出授权回调之前,您只需通过将参数 *authorized 设置为 TRUE 或 FALSE 来决定授权或不授权访问
相关文章:
- 警告处理为错误这里有什么问题
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 使用流处理接收到的数据
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 基于多个条件处理地图中的所有元素
- 如何用数字处理log(0)
- SSL上的`curl_easy_send`和`curl_asy_recv`:如何处理`CURLE_AGAIN`
- 错误处理.将系统错误代码映射到泛型
- 从文本文件中读取时钟时间和事件时间并进行处理
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 用于矢量处理的多个线程
- 对字符串进行排序时,在c++中处理sort()
- 如何处理linux终端中带有负号(-)的C++中的命令行参数
- 处理除以零会导致<csignal>意外行为
- 是否可以在c++中处理字符串流中的各个元素
- 在 c++ WWSAPI Web 服务中处理 WS-Security PasswordDigest 模式