访问WCF中的基础Request(WebRequest或HTTPRequest)对象以获取摘要预身份验证

时间:2013-09-06 19:52:27

标签: wcf web-services authentication digest-authentication pre-authentication

我们通过WCF服务公开Entity对象。要检索实体,我们通过WCF发出几个请求,接近100或更多。我们最近切换到摘要式身份验证,并注意到每个服务器请求都发出了401.这会在服务器上产生两倍的负载,并且由于我们有非常大的“帖子”,这将产生额外的流量延迟。目标是从服务器只有一个Challenge(401),其余的请求应包含Auth头,因此服务器不会发出401.由于Digest是一个基于挑战的协议,即将到期的nonce,即使我们可能无法完全消除401,但至少可以避免每次请求。由于我们控制服务器和客户端,我们希望发送每个请求中包含的Digest Auth标头。 在.NET 2.0 Web服务样式Web引用代理/客户端(继承SOAPHttpClientProtocol)中有一个Pre-Authenticate属性,它允许Auth头包含在请求中,但是使用WCF服务Web引用客户端(使用ChannelFactory) “T。设置此属性时,请求/响应流量存在明显差异,而不是。由于这是摘要式身份验证(非基本),因此我无法在BeginRequest期间使用ClientMessageInspector手动添加Auth标头。

    NetworkCredential creds = new NetworkCredential("username", "pass", "domain");

    //using .NET 2.0 "Web Reference" Style client that uses inherits SoapHttpClientProtocol:
    webReferenceClient = new Service1();
    webReferenceClient.Credentials = creds;
    //**Pre Authenticate **
    webReferenceClient.PreAuthenticate = true;
    string resp1 = "";
    for (int i = 0; i < 3;i++) 
        resp1 = resp1 + webReferenceClient.SayHello("jack");

    //using WCF "Service Reference" Client that uses ChannelFactory
    serviceReferenceClient = new Service1Client();

    serviceReferenceClient.ClientCredentials.HttpDigest.ClientCredential = creds;
    serviceReferenceClient.ClientCredentials.HttpDigest.AllowedImpersonationLevel =          TokenImpersonationLevel.Impersonation;

    string resp="";
    for (var i = 0; i < 3;i++) 
        resp = resp + serviceReferenceClient.SayHello("jack");

使用.NET 2.0样式Web引用客户端进行Fiddler跟踪,并设置了Preauthenticate。请注意,只有一个401,其余的请求都有Auth标头。

PreAuthenticate with .net2.0 style web reference

使用WCF样式服务引用客户端进行跟踪。每个请求都从服务器生成401:

Authenticate Every Singe request

我看到两个选项:

  1. 切换我们的客户端代码以使用.NET 2.0样式的Web引用客户端, 这将是一个重大举措,因为我们正在进行一些自定义故障处理。
  2. 找到一种方法来获取WCF的WebRequest或HTTPRequest对象 ChannelFactory并设置PreAuthenticate属性。 如何获取实际的WebRequest对象??
  3. 还有其他选择吗?

0 个答案:

没有答案