c# - CXF Web 服务的 .NET 客户端身份验证和 SOAP 凭据 header

标签 c# web-services authentication cxf soapheader

场景

我必须使用 .NET 客户端访问 Web 服务。 该服务是 Apache CXF Web 服务。 需要用户名和密码验证。 我已经创建了代理。 我已经设置了凭据。

MyServiceReference proxy = new MyServiceReference();
proxy.Credentials = new NetworkCredential("username", "password");
string res = proxy.Method1();

当我运行客户端时,抛出以下异常:

System.Web.Services.Protocols.SoapHeaderException: An error was discovered processing the <wsse:Security> header

服务发布者告诉我凭据不存在于 SOAP header 中。 所以,我猜 IWebProxy.Credentials不是设置身份验证的正确方法。

问题

那么,如何设置身份验证所需的 SOAP header ?

最佳答案

最终我不得不调用创建整个 SOAP 消息并生成 HttpWebRequest 的服务。在 SOAP 消息中,我手动指定了安全 header :

<soapenv:Header>
  <wsse:Security soapenv:mustUnderstand='1' xmlns:wsse='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'>
     <wsse:UsernameToken wsu:Id='UsernameToken-1' xmlns:wsu='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd'>
        <wsse:Username>Foo</wsse:Username>
        <wsse:Password Type='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText'>Bar</wsse:Password>
        <wsse:Nonce EncodingType='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary'>qM6iT8jkQalTDfg/TwBUmA==</wsse:Nonce>
        <wsu:Created>2012-06-28T15:49:09.497Z</wsu:Created>
     </wsse:UsernameToken>
  </wsse:Security>
</soapenv:Header>

这里是服务客户端:

String Uri = "http://web.service.end.point"
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(Uri);
req.Headers.Add("SOAPAction", "\"http://tempuri.org/Register\"");
req.ContentType = "text/xml;charset=\"utf-8\"";
req.Accept = "text/xml";
req.Method = "POST";

String SoapMessage = "MySoapMessage, including envelope, header and body"
using (Stream stm = req.GetRequestStream())
{
    using (StreamWriter stmw = new StreamWriter(stm))
    {
        stmw.Write(SoapMessage);
    }
}


try
{
    WebResponse response = req.GetResponse();
    StreamReader sr = new StreamReader(response.GetResponseStream());
    log.InfoFormat("SoapResponse: {0}", sr.ReadToEnd());
}
catch(Exception ex)
{
    log.Error(Ex.ToString());
}

有关 Web 服务安全性 (WSS) 的有趣资源:

关于c# - CXF Web 服务的 .NET 客户端身份验证和 SOAP 凭据 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11263640/

相关文章:

c# - 索引超出范围。必须是非负误差

c# - 具有返回值的 WCF 服务器到客户端回调方法

.net - 使用 UriTemplate 在 WCF 中组合 SOAP/JSON/XML

c# - Wcf 和接口(interface)作为参数

authentication - LoopBack 中需要的 2 路 SSL 身份验证/相互身份验证示例

php - 将 javascript 文件置于用户身份验证之后的最佳实践?

c# - 事件选择。这样做的最佳方法是什么

c# - 如何使用Dapper获取存储过程的返回值?

java - Java中使用Metro有什么危险吗

spring-mvc - 在 Spring Boot 中使用 StandardPasswordEncoder