WCF等同于Web引用(Kerberos& WebGate)

时间:2012-01-09 12:10:06

标签: vb.net wcf authentication oracle11g kerberos

我希望你能帮助我。我试图让我的客户端WCF调用行为与我正常工作的Web引用完全相同。

网络参考代码:

Dim wsProxy As New Namespace.ServiceName()
wsProxy.Credentials = CredentialCache.DefaultCredentials
wsProxy.CookieContainer = New CookieContainer()
wsProxy.AllowAutoRedirect = True
wsProxy.WebMethod()

美好而简单。在我看来,WCF等价物应该是:

Dim binding As New BasicHttpBinding(BasicHttpSecurityMode.TransportCredentialOnly)
binding.Security.Tranport.ClientCredentialType = HttpClientCredentialType.Windows
Dim wsProxy As New Namespace.ServiceName(binding, New EndpointAddress("..."))
wsProxy.ClientCredentials.Windows.AllowNtlm = False
wsProxy.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Identification
wsProxy.ChannelFactory.Credentials.Windows.ClientCredential = Net.CredentialCache.DefaultCredentials
wsProxy.WebMethod()

无论我尝试什么,我都无法让WCF等同于进行身份验证。我总是得到:

“HTTP请求未经授权,客户端身份验证方案'Negotiate'。从服务器收到的身份验证标头是'Negotiate,Basic realm =”My Realm“'。

关键标准:

  • 需要使用Kerberos进行身份验证
  • 身份验证过程涉及401质询之前的重定向。
  • Cookie需要保留。

注意:重定向和401由Oracle Access Manager提供 - 但我们知道这里没有什么特别的东西,因为Web引用工作正常。

非常感谢任何帮助!

更新1

感谢您提出的问题 - 在回复diggingforfile时,上面的示例不使用web.config。但是,如果我添加了服务引用,则会设置以下配置:

<basicHttpBinding>
  <binding name="SomeBindingName" closeTimeout="00:01:00"
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
      maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
      messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
      useDefaultWebProxy="true">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
          maxByesPerRead="4096" maxNameTableCharCount="16384"
      <security mode="None">
          <transport clientCredentialType="None" proxyCredentialType="None"
              realm="" />
          <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
  </binding>
<basicHttpBinding>
<client>
  <endpoint address="http://Server/Service"
    binding="basicHttpBinding" bindingConfiguration="SomeBindingName"
    contract="Namespace.ServiceName" name="SomeEndpointName" />
</client>

如果我试试这个,我得到:

“HTTP请求未经授权使用客户端身份验证方案'Anonymous'。从服务器收到的身份验证标头是'Negotiate,Basic realm =”My Realm“'。

0 个答案:

没有答案