使用 CustomBinding 进行抢先式身份验证?

Posted

技术标签:

【中文标题】使用 CustomBinding 进行抢先式身份验证?【英文标题】:Preemptive authentication with CustomBinding? 【发布时间】:2014-12-09 13:20:37 【问题描述】:

我正在使用 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;

现在,有人询问我是否可以将客户端配置为进行抢先式身份验证。我做了一些网页浏览,但没有找到太多。而且我不知道如何将我发现的少量内容集成到我当前的代码中。

【问题讨论】:

【参考方案1】:

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

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 

至于第二个选项,请看这里如何add headers with a message inspector。

【讨论】:

当我尝试这样做时,客户端调用出现异常:“通信对象 System.ServiceModel.Channels.ServiceChannel 无法用于通信,因为它处于故障状态。”当我不添加自己的标题时,我没有收到该错误。 没关系。我正在传递基本身份验证标头而不是设置 ClientCredentials。当我两者都做时,这个错误就消失了。

以上是关于使用 CustomBinding 进行抢先式身份验证?的主要内容,如果未能解决你的问题,请参考以下文章

Apache HttpClient 4.3.1 中使用 HTTP 隧道/HTTPS 连接的抢先式代理身份验证

带有身份验证的 WCF 流式处理

stm32中断优先级

是否可以使用 Ionic 实现一键式 Facebook 登录?

带有 CustomBinding 的 WCF 服务配置 HTTPS

VR说资讯 | 在VR的时间中体验星球毁灭的震撼-Universe Sandbox 2