【问题标题】:Configure WCF for WS-Security with Username over https使用通过 https 的用户名为 WS-Security 配置 WCF
【发布时间】:2010-12-28 05:36:46
【问题描述】:

我正在尝试使用 WCF 客户端通过 https 调用基于 Java、启用 WS-Security 的 Web 服务,但似乎无法正确配置安全性。使用 SvcTraceViewer,我没有看到我尝试过的任何安全配置的预期安全标头。

我最近的安全配置是:

    <wsHttpBinding>
        <binding name="MySoapBinding" closeTimeout="00:01:00"
            openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
            allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
            maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
            messageEncoding="Text" textEncoding="utf-8"
            useDefaultWebProxy="true">
            <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="TransportWithMessageCredential">
            <transport/>
            <message clientCredentialType="UserName" negotiateServiceCredential="false" establishSecurityContext="false"/>
          </security>
        </binding>
    </wsHttpBinding>

我在这样的代码中设置用户名/密码:

    svc.ClientCredentials.UserName.UserName = TestBase.userName;
    svc.ClientCredentials.UserName.Password = TestBase.password;

Java Web 服务需要这样的安全标头:

<wsse:Security soap:mustUnderstand="1">
<wsu:Timestamp wsu:Id="Timestamp-bf41c571-7d32-438c-937e-7d83a3ac2d14">
<wsu:Created>2010-12-27T16:43:16Z</wsu:Created>
<wsu:Expires>2010-12-27T16:48:16Z</wsu:Expires>
</wsu:Timestamp>
<wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="SecurityToken-4c9b30b1-d697-4c64-89cb-a6d7e857aebf">
<wsse:Username>MyUserName</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">MyPassword</wsse:Password>
<wsse:Nonce>pzLdD4S+OCDG6Ut9Ur1oOQ==</wsse:Nonce>
<wsu:Created>2010-12-27T16:43:16Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>

我根本看不到安全标头。

我在网上阅读了很多关于传输与消息级安全和安全模式的信息,但似乎找不到合适的选项集。我应该如何配置我的绑定

  • https 通信
  • SOAP 标头中的用户名/密码,纯文本 (WS-Security)
  • 需要时间戳
  • 需要随机数

【问题讨论】:

  • 如何检查是否包含标题? WCF 支持安全传输通道上的用户名令牌配置文件,但它仅支持不需要其他元素的纯文本密码。所以我有点害怕它不会发送 nonce 和 created 元素。
  • @Ladislav:我正在使用 SvcTraceViewer 查看本地跟踪日志(并在我的 app.config 中启用了消息日志记录)

标签: wcf ws-security


【解决方案1】:

原来 Rick Strahl 也遇到了几乎完全相同的问题。事实证明,SvcTraceViewer 确实显示实际的在线消息。但是,他的博客概述了通过 Charles(或者在我的情况下是免费的 Fiddler 2)代理来查看实际消息的过程。

事实证明,我正在根据我正在调用的 Web 服务的要求发送一个 Timestamp 元素,但如果我这样做了,WCF 会在响应中要求一个 Timestamp(我没有得到)。该错误消息非常具有误导性。幸运的是,我可以更改服务以返回时间戳。

http://www.west-wind.com/weblog/posts/205198.aspx

【讨论】:

  • 要查看 SvcTraceViewer 中的实际消息,您必须设置 logMessagesAtTransportLevel="true" &lt;messageLogging logEntireMessage="true" logMalformedMessages="true" logMessagesAtServiceLevel="false" logMessagesAtTransportLevel="true"
  • @Eric J。您能告诉我您是如何更改服务以返回时间戳的吗?你有没有使用自定义绑定
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-04
  • 1970-01-01
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
相关资源
最近更新 更多