使用 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 连接的抢先式代理身份验证
是否可以使用 Ionic 实现一键式 Facebook 登录?