WCF - Soap 标头在安全元素中引用命名空间两次

Posted

技术标签:

【中文标题】WCF - Soap 标头在安全元素中引用命名空间两次【英文标题】:WCF - Soap header is referencing the namespace, in the security element, twice 【发布时间】:2013-08-07 18:11:46 【问题描述】:

这是一个有点乏味的问题。我已经构建了一个 WCF 来使用 WS-Security,它在我的日志中看起来像这样:

<h:Security xmlns:h="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" 
              xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
  <UsernameToken>
    <Username>
      <!-- Removed-->
    </Username>
    <Password>
      <!-- Removed-->
    </Password>
  </UsernameToken>
</h:Security>

问题是,为什么同一个命名空间会被引用两次(“http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd”)?我知道同一个命名空间是否被引用两次并不重要,只要元素引用正确的命名空间,但我确实想知道为什么要这样做。

我的代码:

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[System.ServiceModel.MessageContractAttribute(IsWrapped = false)]
public partial class InventoryCountRequest


  [System.ServiceModel.MessageHeaderAttribute(Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")]
  public Security Security;

  //Other MessageHeader and MessageBody attributes


[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "3.0.4506.2152")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")]
public partial class Security

  private UsernameToken usernameTokenField;

    [System.Xml.Serialization.XmlElementAttribute(Order = 0)]
    public UsernameToken UsernameToken
    
       getreturn this.usernameTokenField;
       setthis.usernameTokenField = value;
    


[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "3.0.4506.2152")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")]
public partial class UsernameToken

  private string usernameField;
  private Password passwordField;

  [System.Xml.Serialization.XmlElementAttribute(Order = 0)]
  public string Username
  
    getreturn this.usernameField;
    setthis.usernameField = value;
  

  [System.Xml.Serialization.XmlElementAttribute(Order = 1)]
  public Password Password
  
    getreturn this.passwordField;
    setthis.passwordField = value;
  


[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "3.0.4506.2152")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")]
public partial class Password

  private string typeField;
  private string valueField;

  [System.Xml.Serialization.XmlAttributeAttribute()]
  public string Type
  
    getreturn this.typeField;
    setthis.typeField = value;
  

  [System.Xml.Serialization.XmlTextAttribute()]
  public string Value
  
    getreturn this.valueField;
    setthis.valueField = value;
  

非常感谢阅读

【问题讨论】:

我最近正在使用 wcf 程序并使用 Web 服务,但在我的应用程序中,我正在创建一个自定义类并在其中添加令牌命名空间。 也许这会对你有所帮助。 weblog.west-wind.com/posts/2012/Nov/24/… 【参考方案1】:

也许这不是消息在网络上的样子。可能是 WCF 日志查看器添加了它(您可以看到它进行了一些操作,因为它删除了密码)。使用 Fiddler 查看真实消息的外观。

然后您手动(通过数据合同)添加安全标头。一般来说,WCF 可以通过配置绑定来配置。因此,WCF 可能会识别一个安全标头并始终将一些命名空间附加到它。

我不会担心的。

【讨论】:

以上是关于WCF - Soap 标头在安全元素中引用命名空间两次的主要内容,如果未能解决你的问题,请参考以下文章

删除 Soap 标头和命名空间

HTTP 标头或 SOAP 标头中的 WCF 肥皂操作?

SOAP WCF 将 Signature 和 BinarySecurityToken 添加到标头

在现有 WCF SOAP 服务中添加 Http 标头不起作用

将命名空间添加到 WCF 方法

通过身份验证标头 API WCF Soap C# .Net