2011-08-01 182 views
0

我是WCF及其安全人員的新手,因此在尋找幫助解決我遇到的問題。使用WCF服務跨域進行身份驗證的問題

我有一個WCF服務要部署到小型域中的每臺機器上。 WCF服務將被託管在Windows服務中,因爲它的方法需要被調用提升。該服務目前非常受歡迎(它暴露了元數據 - 但我相信這會在稍後關閉 - 這是可能的嗎?)。它使用net.tcp綁定 - 服務的在app.config如下所示:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
    <services> 
     <service behaviorConfiguration="SvcBehavior" name="Microsoft.ServiceModel.Samples.Svc"> 
     <endpoint address="" binding="netTcpBinding" 
      contract="Microsoft.ServiceModel.Samples.ISvc" /> 
     <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration="" 
      contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="net.tcp://*:8100/ServiceModelSamples/service" /> 
      </baseAddresses> 
      <timeouts closeTimeout="00:10:00" openTimeout="00:10:00" /> 
     </host> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="SvcBehavior"> 
      <serviceMetadata httpGetEnabled="false" /> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
</configuration> 

對於客戶端,我有一個的Winforms C#應用程序。該應用程序提供兩個功能,它從服務中提取靜態信息,然後爲用戶提供一個選項來驗證和調用管理方法。因此,身份驗證在客戶端完成。

我使用的ChannelFactory連接到自主機服務是可變的(會提示用戶輸入它在客戶端啓動)和客戶端的app.config文件如下所示 - 它實際上是空的:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
    <bindings> 
    </bindings> 
    <client /> 
    </system.serviceModel> 
</configuration> 

的的ChannelFactory代碼是:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")] 
[System.ServiceModel.ServiceContractAttribute(Namespace = "http://Microsoft.ServiceModel.Samples", ConfigurationName = "ISvc")] 


ChannelFactory<ISvc> myChannelFactory = new ChannelFactory<ISvc>(new NetTcpBinding(), "net.tcp://" + HostName + ":8100/ServiceModelSamples/service"); 
     public static ISvc client = null; 

我有descrives在該服務的方法以及一個接口。

我遇到的主要問題是這樣的。假設有機器1機器2運行在域A。假設機器1承載該服務,並且機器2運行客戶機。

當我連接到服務使用域帳戶DOMAINA \用戶,服務工作正常,但說我有本地用戶機器2並要連接到服務爲機器2 \ LocalUser,我得到以下錯誤信息:

服務器已拒絕客戶端憑據。

我嘗試過將安全模式設置爲none(不是那種我喜歡做的事情),但後來我得到一個錯誤,說客戶端和服務的配置不匹配。

有什麼我可以做的,以解決這個問題?另外,如果運行在domainA \ Machine1上的服務被另一個域的用戶調用 - 例如domainB \ User2

在此先感謝 - 我欣賞一些見解!

查達

回答

2

如果關閉安全您必須打開在關閉客戶端以及服務。如果您在代碼中配置客戶端,則必須爲NetTcpBinding的新實例設置相同的配置,就像您在配置文件中對該服務所做的那樣。

當使用Windows安全性時(默認爲NetTcpBinding)MachineB無法從MachineA驗證本地帳戶(有一些技巧與重複的本地用戶,但我不知道他們是否也與WCF一起工作)。這就是爲什麼你有一個域名。跨域Windows身份驗證需要域之間的信任。

如果您需要驗證跨域用戶或本地用戶,則無法使用Windows身份驗證。還有其他身份驗證機制,但它們需要配置證書(至少在服務上)並使用客戶端證書或用戶名和密碼進行客戶端身份驗證。

+0

非常感謝您的回答 - 現在清楚的是,我無法真正依靠Windows身份驗證跨域或使用本地電腦帳戶與標準身份驗證 - 所以這是我將停止追求。但是,是否可以使用用戶名/密碼身份驗證而不使用證書?另外,是否有任何關於設置客戶端安全性的建議(以防我需要訴諸此) - 我已經看到使用服務引用的示例,但沒有使用channelfactory – Chada

+0

不可以在沒有證書的情況下使用用戶名和密碼。此外,用戶名和密碼沒有證書=沒有安全。 –

+0

如果您需要在客戶端啓動安全性,請配置您正在實例化的「NetTcpBinding」。這是你應該能夠[文檔](http://msdn.microsoft.com/en-us/library/system.servicemodel.nettcpbinding.aspx) –