使用CustomBinding进行先发制人的身份验证



我正在使用WCF针对客户的SOAP服务编写客户端。

为了使身份验证正常工作,我们进行了多次尝试。我最终使用了自定义绑定,因为网上有人说BasicHttpBinding不支持必要的安全选项,而WsHttpBinding也不支持他们正在使用的SOAP 1.1。

所以,我有:

var message = this.constructMessagecollection);
if (message != null)
{
    var ea = new EndpointAddress(this.webServiceUrl);
    var binding = new CustomBinding();
    binding.Elements.Add(new TextMessageEncodingBindingElement(
            MessageVersion.Soap11, Encoding.UTF8));
    binding.Elements.Add(new HttpsTransportBindingElement { AuthenticationScheme = System.Net.AuthenticationSchemes.Basic });
    using (var client = new CustomersWebserviceClient(binding, ea))
    {
        if (!String.IsNullOrWhiteSpace(this.webServiceUsername) && !String.IsNullOrWhiteSpace(this.webServicePassword))
        {
            var credentials = client.ClientCredentials.UserName;
            credentials.UserName = this.webServiceUsername;
            credentials.Password = this.webServicePassword;
        }
        var result = client.ReceiveMessage(message);
        log.writeLine(String.Format("Call to client.ReceiveMessage() returned {0}", result));
    }
    return true;
}

现在,有人问我是否可以将我的客户端配置为进行抢先身份验证。我浏览了一些网页,发现不多。我不知道如何将我发现的一点点东西集成到我当前的代码中。

我认为您不能将WCF配置为预身份验证。您可以选择手动将头添加到每个请求中,或者构建一个消息检查器来执行此操作并配置一次。无论哪种方式,这些设置都与绑定无关。我想您可以编写自己的自定义http传输(内部使用常规http传输)并将其添加到那里,但不确定它是否值得。如上所述,要手动添加,您可以使用:

HttpRequestMessageProperty httpRequestProperty = new HttpRequestMessageProperty(); 
httpRequestProperty.Headers[HttpRequestHeader.Authorization] = "Basic " + 
    Convert.ToBase64String(Encoding.ASCII.GetBytes(client.ClientCredentials.UserName.UserName + ":" + 
    client.ClientCredentials.UserName.Password));
using (OperationContextScope scope = new OperationContextScope(client.InnerChannel)) 
{ 
    OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = 
        httpRequestProperty;
    // Invoke client 
}

至于第二个选项,请参阅如何使用消息检查器添加标头。

最新更新