如何将自定义安全绑定凭据添加到Web服务引用?

时间:2014-05-30 21:52:36

标签: c# wcf soap .net-4.0 wsdl

我是服务参考资料的新手,所以我可能需要简单的解释。

我有一个WSDL:

https://test.servicebench.com/servicebenchv5/services/CRMServiceOrderService?wsdl

我通过MVS2013在项目中添加了服务参考,没有任何问题。

这是自动生成的app.config文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
    <bindings>
        <customBinding>
            <binding name="CRMServiceOrderBinding">
                <textMessageEncoding messageVersion="Soap11" />
                <httpsTransport />
            </binding>
        </customBinding>
    </bindings>
    <client>
        <endpoint 
            address="https://test.servicebench.com/servicebenchv5/services/CRMServiceOrderService"
            binding="customBinding"
            bindingConfiguration="CRMServiceOrderBinding"
            contract="ServiceBenchReference.CRMServiceOrderPortType" 
            name="CRMServiceOrderPort" />
    </client>
</system.serviceModel>
</configuration>

现在,我尝试向服务器发出的每个请求都回复了我:“未经授权”。

我很确定这是因为我没有在SOAP请求标头中传递所需的凭据。

我需要传递3个凭据(或信息?):ServiceBenchID,UserID和密码。

我尝试过使用:

CRMServiceOrderPortTypeClient ServiceOrder = new CRMServiceOrderPortTypeClient();
ServiceOrder.ClientCredentials.UserName.UserName = myUserID;
ServiceOrder.ClientCredentials.UserName.password = myPassword;

但它不起作用。我通过Fiddler检查了请求,但我没有看到标题中传递的凭据。

所以这是我的问题:如何才能正确地在标题中传递这3个自定义凭据信息? (所以我从服务器得到回复)

1 个答案:

答案 0 :(得分:1)

经过几个小时的搜索,我找到了合适的解决方案!

感谢Thorarin的代码,

How can I pass a username/password in the header to a SOAP WCF Service

似乎在app.config文件中使用自定义绑定会强制您手动添加安全元素。我不认为这是最好的方法,但它的工作方式就是这样。