使用WebHttpBinding设置为基本身份验证(HttpClientCredentialType.Basic)的WCF进行POX REST调用时出现问题
而不是在HTTP报头中指定一个来自客户机的“授权:基本”的调用,而是进行两个调用。第一次没有认证的呼叫,其服务响应带有401次未经授权的错误,第二次调用带有正确的身份验证信息。
这似乎是由WCF服务处理,一点也不打嗝。调用第三方服务显然会造成问题,因为它们会立即响应错误。
服务代码:
[ServiceContract]
public interface IService
{
[OperationContract]
[WebInvoke(BodyStyle = WebMessageBodyStyle.Bare,
RequestFormat = WebMessageFormat.Xml,
UriTemplate = "")]
Message SendData(Message message);
}
public class Service : IService
{
public Message SendData(Message message)
{ return Message.CreateMessage(MessageVersion.None, String.Empty, "test");
}
}客户代码:
public class Client: WebChannelFactory<IService>, IService
{
public Client(Uri baseUri, string userName, string password)
: base(CreateBinding(),
baseUri)
{
Credentials.UserName.UserName = userName;
Credentials.UserName.Password = password;
}
public Message SendData(Message requestMessage)
{
var channel = CreateChannel();
Message responseMessage = channel.SendData(requestMessage);
return responseMessage;
}
private static Binding CreateBinding()
{
var binding = new WebHttpBinding();
binding.Security.Mode = WebHttpSecurityMode.TransportCredentialOnly;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
return binding;
}
}使用TcpTrace,我看到这些请求被背靠背地请求:
POST / HTTP/1.1
Content-Type: application/xml; charset=utf-8
VsDebuggerCausalityData: uIDPo2lH6p+lUOdFmrqDKGWYeQkAAAAA7+Y4QR6wNUWZmwCaasMx7xrfcJZxph9NocstwCh8NQsACQAA
Host: localhost:9090
Content-Length: 89
Expect: 100-continue
Connection: Keep-Alive
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">test request</string>
POST / HTTP/1.1
Content-Type: application/xml; charset=utf-8
VsDebuggerCausalityData: uIDPo2lH6p+lUOdFmrqDKGWYeQkAAAAA7+Y4QR6wNUWZmwCaasMx7xrfcJZxph9NocstwCh8NQsACQAA
Authorization: Basic dGVzdDp0ZXN0
Host: localhost:9090
Content-Length: 89
Expect: 100-continue
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">test request</string> 注意,只有第二个调用包含:授权: Basic dGVzdDp0ZXN0如何停止第一个请求(未经授权)?
使用TcpTrace实用程序的示例解决方案可以在这里下载:
WCF-BasicAuthenticationIssue.zip
发布于 2009-09-22 22:23:10
所以根据雷姆斯的回答这是我的解决办法
public Message SendData(Message requestMessage)
{
var channel = CreateChannel();
Message responseMessage;
using (new OperationContextScope((IClientChannel)channel))
{
WebOperationContext.Current.OutgoingRequest
.Headers[HttpRequestHeader.Authorization] = "Basic "
+ Convert.ToBase64String(Encoding.ASCII.GetBytes(
Credentials.UserName.UserName + ":" + Credentials.UserName.Password));
responseMessage = channel.SendData(requestMessage);
}
return responseMessage;
}我只是强迫第一次请求使用基本授权
发布于 2009-09-22 20:32:53
问题实际上在于这些第三方。每个RFC 2617基本身份验证是在两个调用中完成的,就像Digest一样。服务器应该在第一次调用时响应一个包含一个领域的挑战:
在收到未授权的URI请求时, 保护空间,源服务器可能会响应如下的挑战 以下内容如下: WWW-身份验证: Basic realm="WallyWorld“ 其中"WallyWorld“是服务器分配用于标识 请求URI的保护空间。
WCF端点将仅在第一个调用之后对后续调用进行预验证。应用域对任何资源进行的第一次调用都不会包含基本的标题、用户名和密码。
另见WCF中的PreAuthenticate标志发生了什么?。
https://stackoverflow.com/questions/1462256
复制相似问题