如何使用basicHttpBinding和Windows身份验证和二进制编码配置WCF服务

时间:2014-10-09 04:03:53

标签: c# asp.net .net wcf authentication

我的问题子集中存在许多现有问题/答案(使用Windows身份验证进行basicHttpBinding,使用自定义绑定,指定binaryMessageEncoding)。但是,对于所有这三个项目的特定组合,没有现有的答案。

我使用basicHttpBinding开始使用简单的WCF服务,使用Windows身份验证, 所以绑定部分看起来像:

    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpWindowsBinding">
                <security mode="TransportCredentialOnly">
                    <transport clientCredentialType="Windows" />
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>

我测试了WCF服务,它在Windows方面运行得很好 认证。但后来,我想利用二进制消息编码来提升 性能。所以,当我转向自定义绑定区域时,因为它 似乎只能为a中的basicHttpBinding指定二进制消息编码 自定义绑定部分,例如:

    <bindings>
        <customBinding>
            <binding name="BasicHttpWindowsBinding">
                <binaryMessageEncoding />
                <httpTransport />
            </binding>
        </customBinding>
    </bindings>

(我需要这些精确的组合;请不要建议我切换到wsHttpBinding,或使用netTcpBinding等。)

但是现在我遇到了问题(除非我遗漏了什么)因为你只能指定 basicHttpBinding部分下的windows身份验证,你只能 在customBinding部分下为http协议指定binaryMessageEncoding。

所以我的问题是,如何使用Windows指定basicHttpBinding协议 身份验证,并使用binaryMessageEncoding,如果可能的话? (我必须诚实并承认 我发现WCF服务的配置非常难以理解, 至少当自定义绑定被抛入混合时......)

我认为正确的自定义绑定规范是:

    <bindings>
        <customBinding>
            <binding name="BasicHttpWindowsBinding">
                <binaryMessageEncoding />
                <httpTransport authenticationScheme="Windows" />
            </binding>
        </customBinding>
    </bindings>

...但这实际上完全等同于

    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpWindowsBinding">
                <security mode="TransportCredentialOnly">
                    <transport clientCredentialType="Windows" />
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>

...关于指定Windows身份验证(Kerberos,而不仅仅是Ntlm) 对于WCF服务?

2 个答案:

答案 0 :(得分:0)

Windows身份验证:

<bindings>
  <basicHttpBinding>
    <binding name="BasicHttpEndpointBinding">
     <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Windows" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>

HttpBinding:

<services>
  <service behaviorConfiguration="ServiceBehavior" name="Service">
    <endpoint address="" binding="basicHttpBinding"
      bindingConfiguration="BasicHttpEndpointBinding"
      name="BasicHttpEndpoint" contract="IService">
      <identity>
        <dns value="localhost" />
      </identity>
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding"
        contract="IMetadataExchange" />
  </service>
</services>

答案 1 :(得分:0)

所以,我做了一些实验和(1)要在自定义绑定中真正指定基于Kerberos的Windows身份验证,可以这样做:

<bindings>
    <customBinding>
        <binding name="BasicHttpWindowsBinding">
            <binaryMessageEncoding />
            <httpTransport authenticationScheme="IntegratedWindowsAuthentication" />
        </binding>
    </customBinding>
</bindings>

但是,在部署到IIS客户端的MVC Web应用程序的web.config文件和部署到IIS的WCF服务应用程序的web.config文件中都指定了这一点,我无法在没有得到各种各样的情况下使用它错误,从401'到'Kerberos无法获得令牌'等等(我做了大量的研究和实验,确保部署的客户端MVC Web应用程序和部署的WCF服务应用程序(在Windows 7上部署到IIS Express 7.5) Visual Studio 2012发布过程的64位笔记本电脑)在其web.config文件中指定Windows身份验证,并且IIS虚拟目录/应用程序都具有禁用匿名身份验证和启用Windows身份验证等。)

我最终只是在MVC客户端Web应用程序的web.config中创建绑定部分说:

<bindings>
    <customBinding>
        <binding name="BasicHttpWindowsBinding">
            <binaryMessageEncoding />
            <httpTransport authenticationScheme="Ntlm" />
        </binding>
    </customBinding>
</bindings>

但在“部署到IIS”WCF服务应用程序的web.config绑定部分中保留“IntegratedWindowsAuthentication”。然后它运作得很好。

我将完全复制我的解决方案 - MVC客户端应用程序,WCF服务库/应用程序 - 并省略binaryMessageEncoding并使用常规配置部分使用Windows身份验证执行basicHttpBinding(即,不使用自定义绑定),以查看是否存在相同的行为或者IntegratedWindowsAuthentication是否可以从“端到端”工作(在WCF服务应用程序web.config的绑定部分和MVC Web应用程序的web.config绑定部分中指定)。

如果在客户端和服务web.config绑定部分中指定IntegratedWindowsAuthentication没有问题,那么我将知道(1)在使用自定义绑定时,在客户端和服务端都指定了IntegratedWindowsAuthentication的实际问题,或者(2)当我在使用自定义绑定时在客户端和服务端指定IntegratedWindowsAuthentication时,我无法弄清楚如何使其工作(当然,除非它真的应该这样做的方式是说WCF服务web.config中的“IntegratedWindowsAuthentication”和MVC客户端Web应用程序的web.config中的“Ntlm”。

当我有时间时,会使用非利用自定义绑定的结果(因此使用默认文本消息编码)实验添加简短的模糊。