首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用WebHttpBinding设置为基本身份验证的WCF进行POX REST调用时的双重请求

使用WebHttpBinding设置为基本身份验证的WCF进行POX REST调用时的双重请求
EN

Stack Overflow用户
提问于 2009-09-22 19:57:43
回答 2查看 1.8K关注 0票数 2

使用WebHttpBinding设置为基本身份验证(HttpClientCredentialType.Basic)的WCF进行POX REST调用时出现问题

而不是在HTTP报头中指定一个来自客户机的“授权:基本”的调用,而是进行两个调用。第一次没有认证的呼叫,其服务响应带有401次未经授权的错误,第二次调用带有正确的身份验证信息。

这似乎是由WCF服务处理,一点也不打嗝。调用第三方服务显然会造成问题,因为它们会立即响应错误。

服务代码:

代码语言:javascript
复制
[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");
    }
}

客户代码:

代码语言:javascript
复制
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,我看到这些请求被背靠背地请求:

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

发布于 2009-09-22 22:23:10

所以根据雷姆斯的回答这是我的解决办法

代码语言:javascript
复制
        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;
    }

我只是强迫第一次请求使用基本授权

票数 4
EN

Stack Overflow用户

发布于 2009-09-22 20:32:53

问题实际上在于这些第三方。每个RFC 2617基本身份验证是在两个调用中完成的,就像Digest一样。服务器应该在第一次调用时响应一个包含一个领域的挑战:

在收到未授权的URI请求时, 保护空间,源服务器可能会响应如下的挑战 以下内容如下: WWW-身份验证: Basic realm="WallyWorld“ 其中"WallyWorld“是服务器分配用于标识 请求URI的保护空间。

WCF端点将仅在第一个调用之后对后续调用进行预验证。应用域对任何资源进行的第一次调用都不会包含基本的标题、用户名和密码。

另见WCF中的PreAuthenticate标志发生了什么?

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1462256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档