2010-11-29 126 views
2

我有兩個網站託管在同一個IIS服務器上。 SiteA包含需要由SiteB訪問的WCF服務,以及在域中進行身份驗證的任何其他服務。配置WCF安全(wsHttpBinding)

服務配置了的wsHttpBinding,因此我相信,在默認情況下使用Windows的安全性。現在我可以從本地機器上運行的控制檯應用程序調用服務,也可以從運行在默認Visual Studio Web服務器中的Web應用程序調用服務,所以我認爲該認證正在工作。

但是,當SiteB嘗試訪問服務時,它會失敗,並顯示以下錯誤: 調用者未被服務驗證。

網站B在同一臺機器不是站點A上運行,所以我不明白爲什麼它不能進行身份驗證。 SiteB使用表單身份驗證,並將匿名訪問映射到域用戶。

下面是配置位:

站點A(服務):

<system.serviceModel> 
     <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
     <services> 
      <service behaviorConfiguration="wcfServiceBehaviour" name="MyService"> 
       <endpoint address="" binding="wsHttpBinding" contract="IServiceContract" /> 
       <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
      </service> 
     </services> 
     <behaviors> 
      <serviceBehaviors> 
       <behavior name="wcfServiceBehaviour"> 
        <serviceMetadata httpGetEnabled="true" /> 
        <serviceDebug includeExceptionDetailInFaults="true" /> 
       </behavior> 
      </serviceBehaviors> 
     </behaviors> 
    </system.serviceModel> 

網站B(客戶端):

<system.serviceModel> 
    <client> 
     <endpoint address="http://xxxxx/Services/xxService.svc" 
       binding="wsHttpBinding" 
       contract="IServiceContract" /> 
    </client> 
</system.serviceModel> 
+0

澤維爾嗨,我的道歉,我錯了。我顯然錯過了這一點。 – Aliostad 2010-11-29 09:23:56

回答

1

你是正確的 - 在WCF配置的wsHttpBinding將默認使用Windows身份驗證。

這裏有一個建議 - WCF - changing endpoint address results in securityexception - 的身份塊將不會使用Windows身份驗證工作 - 嘗試將其移除。

+0

感謝您的提示。我已經刪除了身份代碼塊,但身份驗證仍然不起作用。我編輯了我的問題以反映這些變化。 – 2010-11-29 03:03:59

+1

你有沒有考慮使用NetNamedPipeBinding而不是wsHttpBinding?這種綁定對於同一機器的處理是安全和優化的。如果您仍然需要提供外部訪問,則可以保留wsHttpBinding(假設它適用於外部用戶)。您只需更改綁定名稱並將http://更改爲net.pipe://即可。 – 2010-11-29 03:56:27

1

當網站B假冒其他用戶,並您的代碼指定impersonation level

我的猜測是,你沒有指定足夠高的模擬水平。 (授權最高,允許SiteB將權限傳遞給其他服務)。

我懷疑修復了網站B模擬代碼將足以解決問題。

如果沒有,嘗試通過允許的模擬級別服務器:

<system.serviceModel> 
    <client> 
     <endpoint address="http://xxxxx/Services/xxService.svc" 
       binding="wsHttpBinding" 
       contract="IServiceContract" 
       behaviorConfiguration = "ImpersonationBehavior" /> 
    </client> 
     <behaviors> 
      <endpointBehaviors> 
       <behavior name="ImpersonationBehavior"> 
        <clientCredentials> 
         <windows allowedImpersonationLevel = "Delegation" /> <!-- The highest level --> 
        </clientCredentials> 
       </behavior> 
      <endpointBehaviors> 
     </behaviors> 
</system.serviceModel> 
0

如果您使用的是自託管的網站和我一樣,爲了避免這個問題(如上所述)的方式是規定在主機和客戶端,wsHttpBinding安全模式= NONE。

在創建綁定,客戶端和主機上,您可以使用此代碼:

Dim binding as System.ServiceModel.WSHttpBinding 
binding= New System.ServiceModel.WSHttpBinding(System.ServiceModel.SecurityMode.None) 

System.ServiceModel.WSHttpBinding binding 
binding = new System.ServiceModel.WSHttpBinding(System.ServiceModel.SecurityMode.None);