【问题标题】:How to get the base64 signature encoding for a WCF request如何获取 WCF 请求的 base64 签名编码
【发布时间】:2013-12-22 08:23:39
【问题描述】:

我有一个 WCF 客户端代理,并且正在使用以下绑定元素对第三方 Java Web 服务的请求进行签名:

Dim asec As TransportSecurityBindingElement = SecurityBindingElement.CreateCertificateOverTransportBindingElement()
asec.EnableUnsecuredResponse = True
asec.SetKeyDerivation(False)
asec.AllowInsecureTransport = True
asec.IncludeTimestamp = True

但是,我被告知在服务端存在验证错误:

签名验证失败:编码类型无效(只有 base64 是 支持)用于令牌:uuid-168b7c90-2d6a-4928-9979-94cb84443d3b-1

所以我假设我需要将一些东西(可能是签名?)设置为 base64 编码。我该怎么做?

【问题讨论】:

    标签: vb.net wcf wcf-binding wcf-client


    【解决方案1】:

    回答你的答案中的问题:

    虽然我不知道为什么会这样,也不知道这意味着什么。

    SecurityBindingElement.CreateCertificateOverTransportBindingElement() 将绑定的 MessageSecurityVersion 初始化为其默认值,即:

    WS-Security 1.1、2005 年 2 月的 WS-Trust、2005 年 2 月的 WS-SecureConversation 和 WS-SecurityPolicy 1.1。

    使用您现在调用的重载,您可以指定以下内容:

    Basic Security Profile 1.0 基于 WS-Security 1.0、2005 年 2 月的 WS-Trust、2005 年 2 月的 WS-SecureConversation 和 WS-SecurityPolicy 1.1 安全规范。

    要确定 WCF 实际发出的 EncodingType,您必须在两者之间放置一个 HTTP 监视器(例如 Fiddler),或者让 .NET 输出跟踪信息以记录正在发送的消息。您还可以访问或请求服务器日志以查看服务器认为消息无效的原因。

    但我怀疑,鉴于实际错误消息的某些 Web 搜索,Java 服务器抱怨您的 WCF 客户端忽略wsse:BinarySecurityToken 上的EncodingType=...#Base64Binary。根据spec,这是唯一允许的值(或者如果双方同意,则为自定义值)并且它没有标记为可选。

    在将 MessageSecurityVersion 更改为 WS-sec 1.0 后,也解释了 here(很容易找到 - 一旦你知道你在寻找什么),我猜 WCF 显式输出 EncodingType 属性,导致服务接受消息。

    【讨论】:

    • 谢谢。其中很多是知道要寻找什么,不幸的是,我从服务所有者那里得到的信息很少,而且对 WCF 的这一部分也是新手,似乎很难知道要寻找什么。到达这里的路还很长(4 个其他问题):stackoverflow.com/q/20349062/198048stackoverflow.com/q/19704629/198048stackoverflow.com/q/19431827/198048stackoverflow.com/q/19427768/198048
    • @MrShoubs 很好的问题,很好的研究并为自我回答竖起大拇指! (不是字面意思,否则会被认为是连续投票。)太糟糕了,他们没有得到那么多关注。互操作性有时具有挑战性。 :)
    • 希望我的回答能帮助其他有类似问题的人。虽然我猜想与互操作性有关,但其中涉及的因素太多,使每种情况都相当独特。
    【解决方案2】:

    将 MessageSecurityVersion 设置为 WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10 似乎可以解决问题:

    Dim asec As TransportSecurityBindingElement = SecurityBindingElement.CreateCertificateOverTransportBindingElement(ServiceModel.MessageSecurityVersion.WSSecurity10WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11BasicSecurityProfile10)
    

    虽然我不知道为什么会这样,也不知道这意味着什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-21
      • 2019-06-19
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      • 2014-03-03
      • 1970-01-01
      相关资源
      最近更新 更多