c++ - 在 c++ WWSAPI Web 服务中处理 WS-Security PasswordDigest 模式

标签 c++ web-services soap ws-security wwsapi

我使用 WWSAPI 继承了一个用 c++ 编写的现有且可工作的 Web 服务。
我必须在soap头中使用passworddigest来实现基于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 文档,但不明白从哪里开始实现这种安全性。

我使用绑定(bind) WS_STRING_USERNAME_MESSAGE_SECURITY_BINDING_TYPE 进行了测试,我可以为此定义一个密码验证器回调,这似乎与一个简单的用户/密码方案一起使用。但是在哪里/如何定义密码摘要安全机制?

使用 API,我期待一个简单的设置来定义基本的摘要机制和一个回调来接收随机数、创建日期、用户名和密码,但我不明白从哪里开始。
我不明白这是否需要简单的声明(绑定(bind) + 属性 + 回调),或者我是否需要编写一些代码,例如手动解析 xml header 。

有人使用 WS-Security 实现了 WWSAAPI Web 服务,如何实现?

最佳答案

好的,所以,似乎没有人用纯 C++ 实现 Web 服务?
无论如何,我找到了答案:这必须(实际上)手工完成。
要点是:

  • 必须在 WS_SERVICE_POINT 结构中定义授权回调
  • 必须通过以下操作在此回调中读取和检查 WS-security header :
  • 使用 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”的位置调用WsMarkHeaderAsUnderstood
  • 现在 XML 已解析,您可以对 WS-Security 标记执行任何操作来验证它们是否有效
  • 在退出授权回调之前,您只需决定是否授权访问,通过将参数 *authorized 设置为 TRUE 或 FALSE
  • 关于c++ - 在 c++ WWSAPI Web 服务中处理 WS-Security PasswordDigest 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59357960/

    相关文章:

    c++ - 没有模板也能完美转发吗

    regex - nginx重写: the symbol for ANY UTF8 character

    java - 是否有任何 IntelliJ 功能可以在两个相似对象之间映射值?

    php - NuSoap 与 PHP Soap 库。 getError 在哪里?

    c# - 上传到asp.net iis服务器时如何修复 "MessageEncoder content type parsing is not supported"错误?

    c++ - 为什么使用 CvScalar

    c++ - 从模板中的类获取类型

    c++ - 错误 : ‘root’ does not name a type

    java - jax-ws 服务中的 "Operation Connection.commit is not allowed during a global transaction"

    python - XAMPP - 在网页上执行 Python 脚本