我一直都在网为这一点。 我刚刚一直有一个时间的魔鬼做,并且其网络服务我想占用拒绝正式支持WCF作为消费的一个方法的供应商。
我没有Web服务专家,所以我会尽我所能来记录以及与此初始后解释,但通过各种手段,如果你需要它获得更多信息,并希望我能提供一切必要。
服务
在我的公司,我们使用的是公开服务供应商的应用程序。 该应用程序是用Java编写的,它看起来像WSDL与Apache Axis的1.2创建的。
代码
我的遗留代码使用WSE 3.0。 特别是,它使用了“WSE”末自动上涨的代理类。 这让我用一个更简单的身份验证方案(我能得到它的工作的唯一途径)。 我并不需要使用证书。 我用的衍生物SecurityPolicyAssertion
,并在其包装Policy
获取传递给对象SetPolicy
客户端类的方法。 这里的一切,我需要做创建客户端的工作实例:
MyWebServiceWse api = new MyWebServiceWse();
api.Url = myUrl;
api.SetPolicy(new Policy(new MyDerivedSecurityAssertion(user, pass)));
我默认情况下,外的现成的WCF代码(有服务引用生成)不接受凭据,所以我知道有一个问题马上蝙蝠。 我读过关于网络使用不同的各种事情security
或在我的绑定设置app.config
,但没有曾经完全奏效。 我丰富的修修补补之后最常见的错误是WSDoAllReceiver: Request does not contain required Security header
。
下面是在app.config。 网上再次,我已经看到了不同的看法 - 或许我们可以告诉我应该是什么改变这里,以方便传递凭据开始。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<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"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://xyz:12345/services/MyService"
binding="basicHttpBinding" bindingConfiguration="MySoapBinding"
contract="MyNS.MyService" name="MyService" />
</client>
</system.serviceModel>
</configuration>
我已经改变了一些属性掩盖,我们所使用的特定服务(公司政策和所有)。
这里是C#示例代码到目前为止(在一个控制台应用程序测试):
MyClient client = new MyClient();
client.listMethod();
UPDATE
阅读SO帖子: WCF安全。 。 。 。
我已经相应地更新我的app.config,和我现在通过用户名和PWD代码。 我仍然收到了同样的错误:
WSDoAllReceiver: Request does not contain required Security header
20120517 UPDATE
一个成功的请求(来自WSE3):
<soap:Header>
<wsa:Action>
</wsa:Action>
<wsa:MessageID>urn:uuid:cb739422-c077-4eec-8cb2-686837b76878</wsa:MessageID>
<wsa:ReplyTo>
<wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address>
</wsa:ReplyTo>
<wsa:To>http://removed-for-security</wsa:To>
<wsse:Security soap:mustUnderstand="1">
<wsu:Timestamp wsu:Id="Timestamp-e13feaf9-33d9-47bf-ab5b-60b4611eb81a">
<wsu:Created>2012-05-17T11:25:41Z</wsu:Created>
<wsu:Expires>2012-05-17T11:30:41Z</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-00c26e1a-3b3b-400f-a99a-3aa54cf8c8ff">
<wsse:Username>change-to-protect-the-innocent</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">nice-try</wsse:Password>
<wsse:Nonce>KJMvUuWF2eO2uIJCuxJC4A==</wsse:Nonce>
<wsu:Created>2012-05-17T11:25:41Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
</soap:Header>
<soap:Body>
<listChannels xmlns="http://removed-for-security">
<rowfrom>0</rowfrom>
<rowto>10</rowto>
</listChannels>
</soap:Body>
</soap:Envelope>
在得到WCF跟踪工作 - 将在短期内增加。
20120517更新2
下面是从WCF信封:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none"></Action>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<listChannels xmlns="http://removed-for-security">
<rowfrom>1</rowfrom>
<rowto>2147483647</rowto>
</listChannels>
</s:Body>
</s:Envelope>
20120518 UPDATE我试图实现在麦克-米勒链接到的意见后的解决方案。 现在,我收到以下错误(没有消息最终得到发送,因为东西是barfing的方案):
The provided URI scheme 'http' is invalid; expected 'https'.
而如果有人要问,是的,我需要通过HTTP发送,是的,我知道,凭据作为字符串加密发送:-)