2011-10-20 100 views
2

我有一個WCF服務託管在Windows服務中,並且正從Windows窗體應用程序調用。我正在使用Windows身份驗證和模擬。假冒正在起作用;但是,當我嘗試使用集成安全性訪問SQL Server時,我得到「用戶登錄失敗」。 「。託管控制檯應用程序中的服務時,我也會得到相同的結果。如果我使用SQL安全性,那麼所有工作都應該如此。在WCF服務中使用模擬時SQL登錄失敗

這是我的服務配置文件。

<system.serviceModel> 
<bindings> 
    <wsHttpBinding> 
    <binding name="WSHttpBinding_IService"> 
     <security mode="Message"> 
     <transport clientCredentialType="Windows" 
        proxyCredentialType="None" realm="" /> 
     <message clientCredentialType="Windows" 
       negotiateServiceCredential="true" 
       algorithmSuite="Default" 
       establishSecurityContext="true" /> 
     </security> 
    </binding> 
    </wsHttpBinding> 
</bindings> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="ServiceBehavior"> 
    <serviceMetadata httpGetEnabled="true" /> 
    <serviceDebug includeExceptionDetailInFaults="false" /> 
    <serviceAuthorization impersonateCallerForAllOperations="true" /> 
    </behavior> 
    </serviceBehaviors> 
    <serviceBehaviors> 
    <behavior name="DefaultBehavior"> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<services> 
    <service behaviorConfiguration="ServiceBehavior" name="AfsNetService"> 
    <endpoint address="" binding="wsHttpBinding" contract="IAfsNetService"> 
     <identity> 
     <userPrincipalName value="[email protected]" /> 
     <servicePrincipalName value="localhost" /> 
     <!--<dns value="" />--> 
     </identity> 
    </endpoint> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    </service> 
</services> 

任何幫助,這是表示讚賞。

回答

1

這不是一個WCF問題,而是網絡中機器間認證發生的基本結果。這是classic "double hop" authentication issue。承載服務的服務器與數據庫服務器之間的第二跳的委託認證通常是不可能的,除非所有認證都使用Kerberos,並且特別配置了委託。

如果所涉及的所有計算機(即運行WinForms應用程序的工作站,託管服務的服務器和數據庫服務器)都支持Kerberos身份驗證並且不會回退到NTLM,則此方案只能在所有計算機上運行。

如果您確定所有身份驗證都使用Kerberos,那麼您必須確保該委派已正確配置。 This checklist可能會有所幫助,但其中一些與IIS是中間層服務器有關,而不是像您一樣具有自定義服務。

1

我不確定這是否會解決您的問題,但似乎您的XML配置丟失bindingConfiguration標記。我認爲它應該是這樣的:

<endpoint address="" binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IService"/>