2009-06-25 128 views
53

我創建了一個WCF服務並將其部署在服務器上。當我瀏覽這個服務時,它給了我積極的迴應,使用?wsdl URL。現在我試圖通過WCF Test客戶端來測試服務。它顯示適當的元數據。但是,當我嘗試從服務調用任何方法,它爲我破例?這裏有與堆棧跟蹤埃羅細節..WCFTestClient該HTTP請求未經授權,客戶端身份驗證方案'匿名'

的HTTP請求是未經授權 客戶端身份驗證方案 「無名氏」。從服務器收到的驗證報頭 是'協商,NTLM' 。

服務器堆棧跟蹤:


System.ServiceModel.Channels.HttpChannelUtilities.ValidateAuthentication(HttpWebRequest的 請求,響應HttpWebResponse, 引發WebException responseException, HttpChannelFactory廠)
HTTP請求是未經授權客戶端 認證方案'匿名'。從 收到的 驗證標頭的服務器是'協商,NTLM'。

服務器堆棧跟蹤:


System.ServiceModel.Channels.HttpChannelUtilities.ValidateAuthentication(HttpWebRequest的 請求,響應HttpWebResponse, 引發WebException responseException, HttpChannelFactory工廠)

客戶端綁定:

<bindings> 
    <wsHttpBinding> 
     <binding name="WSHttpBinding_IServiceMagicService" closeTimeout="00:01:00" 
      openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" 
      bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard" 
      maxBufferPoolSize="524288" maxReceivedMessageSize="65536" 
      messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" 
      allowCookies="false"> 
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
       maxBytesPerRead="4096" maxNameTableCharCount="16384" /> 
      <reliableSession ordered="true" inactivityTimeout="00:10:00" 
       enabled="false" /> 
      <security mode="None"> 
       <transport clientCredentialType="Windows" proxyCredentialType="None" 
        realm="" /> 
       <message clientCredentialType="Windows" negotiateServiceCredential="true" 
        establishSecurityContext="true" /> 
      </security> 
     </binding> 
    </wsHttpBinding> 
</bindings> 

服務器綁定:

<bindings> 
    <wsHttpBinding> 
    <binding name="WSHttpBinding_SEOService" closeTimeout="00:10:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="true" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="999524288" maxReceivedMessageSize="655360000" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false"> 
     <readerQuotas maxDepth="32" maxStringContentLength="900000" maxArrayLength="900000" maxBytesPerRead="900000" maxNameTableCharCount="900000" /> 
     <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false" /> 
     <security mode="None"> 
     <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" /> 
     <message clientCredentialType="Windows" negotiateServiceCredential="true" establishSecurityContext="true" /> 
     </security> 
    </binding> 
    <binding name="WSHttpServiceMagicBinding" closeTimeout="00:10:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:10:00" bypassProxyOnLocal="true" transactionFlow="false" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="999524288" maxReceivedMessageSize="655360000" messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true" allowCookies="false"> 
     <readerQuotas maxDepth="32" maxStringContentLength="900000" maxArrayLength="900000" maxBytesPerRead="900000" maxNameTableCharCount="900000"/> 
     <reliableSession ordered="true" inactivityTimeout="00:10:00" enabled="false"/> 
     <security mode="None"> 
     <transport clientCredentialType="Windows" proxyCredentialType="None" realm=""/> 
     <message clientCredentialType="Windows" negotiateServiceCredential="true" establishSecurityContext="true"/> 
     </security> 
    </binding> 
    </wsHttpBinding> 
</bindings> 

客戶端的客戶端部分:

<client> 
    <endpoint address="http://hydwebd02.solutions.com/GeoService.Saveology.com/ServiceMagicService.svc" 
     binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IServiceMagicService" 
     contract="IServiceMagicService" name="WSHttpBinding_IServiceMagicService" /> 
</client> 

服務器的服務組:

<services> 
    <service behaviorConfiguration="GeoService.Saveology.com.CityStateServiceProviderBehavior" 
    name="GeoService.Saveology.com.CityStateServiceProvider"> 
    <endpoint binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_SEOService" 
     contract="SEO.Common.ServiceContract.ICityStateService" /> 
    <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="" 
     contract="IMetadataExchange" /> 
    </service> 
    <service behaviorConfiguration="GeoService.Saveology.com.ServiceMagicServiceProviderBehavior" 
    name="GeoService.Saveology.com.ServiceMagicServiceProvider"> 
    <endpoint binding="wsHttpBinding" bindingConfiguration="WSHttpServiceMagicBinding" 
     contract="SEO.Common.ServiceContract.IServiceMagicService"> 
    </endpoint> 
    <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="" contract="IMetadataExchange" /> 
    </service> 
</services> 
+0

OK,感謝 - 但你還需要發佈服務器的部分,並在客戶端的部分,所以我們會看到這些端點是如何建立和要打電話給他們.... .. – 2009-06-25 14:40:59

+0

我已經發布了兩個客戶端的 sectiona dn服務器的部分。 – user82613 2009-06-26 09:02:59

+0

當您使用真實客戶端調用這些方法時會發生什麼? – 2009-06-25 13:53:56

回答

9

我有一個類似的問題,你有沒有嘗試過:

proxy.ClientCredentials.Windows.AllowedImpersonationLevel = 
      System.Security.Principal.TokenImpersonationLevel.Impersonation; 
0

剛剛在開發機器上遇到這個問題(生產工作很好)。我在IIS中修改我的配置以允許匿名訪問並將我的名稱和密碼作爲憑證。

不是我確定的最佳方式,但它適用於測試目的。

6

我認爲這還沒有回答,這是一個確切的報價from here

WsHttpBinding的將嘗試並執行在SSP層的內部談判。爲了獲得成功,您需要在VDir中允許匿名訪問IIS。 WCF將默認通過SPNEGO獲取窗口憑證。允許匿名在IIS層不允許任何人,它推遲到WCF堆棧。

我發現這個通過:http://fczaja.blogspot.com/2009/10/http-request-is-unauthorized-with.html

谷歌搜索後:在爲我打電話到服務的安全配置http://www.google.tt/#hl=en&source=hp&q=+The+HTTP+request+is+unauthorized+with+client+authentication+scheme+%27Anonymous

70

我沒有控制權,但得到了同樣的錯誤。我能夠修復我的客戶如下。

  1. 在配置,設置安全模式:

    <security mode="TransportCredentialOnly"> 
        <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" /> 
        <message clientCredentialType="UserName" algorithmSuite="Default" /> 
    </security> 
    
  2. 在代碼中設置代理類,允許模擬(我添加了一個參考的服務,稱爲客戶):

    Customer_PortClient proxy = new Customer_PortClient(); 
    proxy.ClientCredentials.Windows.AllowedImpersonationLevel =  
         System.Security.Principal.TokenImpersonationLevel.Impersonation; 
    
3

這就是我必須做的才能讓這個工作。這意味着:

  1. 定製UserNamePasswordValidator(不需要Windows帳戶,SQLServer的或ActiveDirectory中 - 你UserNamePasswordValidator可能會對用戶名密碼&硬編碼,或從一個文本文件中,MySQL或任何閱讀)。
  2. HTTPS
  3. IIS7
  4. .NET 4.0

我的網站是通過DotNetPanel管理。它具有虛擬目錄的3個安全選項:

  1. 允許匿名訪問
  2. 啓用基本驗證
  3. 啓用集成Windows身份驗證

只有「允許匿名訪問」需要(儘管是,本身還不夠)。

設置

proxy.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation; 

並沒有使我的情況不同。

但是,使用這種結合的工作:

 <security mode="TransportWithMessageCredential"> 
     <transport clientCredentialType="Windows" /> 
     <message clientCredentialType="UserName" /> 
     </security>   
3

另一種可能的解決這個錯誤,我發現。可能沒有回答OP的確切問題,但可以幫助其他人偶然發現此錯誤消息。

我創建使用的WebHttpBinding我的代碼客戶端,以複製以下行:

<security mode="TransportCredentialOnly"> 
    <transport clientCredentialType="Windows" proxyCredentialType="Windows" /> 
</security> 

我不得不這樣做:

var binding = new WebHttpBinding(WebHttpSecurityMode.TransportCredentialOnly); 
       binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Windows; 
       binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.Windows; 

以及設置proxy.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;

1

嘗試在您的客戶端提供用戶名和密碼,如下所示

client.ClientCredentials.UserName.UserName = @「Domain \ username」; client.ClientCredentials.UserName.Password =「password」;

0

我今天在將服務調用到Azure的臨時環境中的服務部署後出現同樣的錯誤。本地服務稱爲外部服務,沒有錯誤,但部署後沒有。

最後證明外部服務具有IP驗證。 Azure中的新環境有另一個IP,並被拒絕。

所以,如果你得到這個錯誤調用外部服務

這可能是一個IP限制。

4

我有一個類似的問題,並嘗試了上面提到的一切。然後我嘗試將clientCreditialType更改爲Basic,並且一切正常。

<basicHttpBinding> 
    <binding name="BINDINGNAMEGOESHERE" > 
     <security mode="TransportCredentialOnly"> 
     <transport clientCredentialType="Basic"></transport> 
     </security> 
    </binding> 
    </basicHttpBinding> 
相關問題