我是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?
在此先感謝 - 我欣賞一些見解!
查達
非常感謝您的回答 - 現在清楚的是,我無法真正依靠Windows身份驗證跨域或使用本地電腦帳戶與標準身份驗證 - 所以這是我將停止追求。但是,是否可以使用用戶名/密碼身份驗證而不使用證書?另外,是否有任何關於設置客戶端安全性的建議(以防我需要訴諸此) - 我已經看到使用服務引用的示例,但沒有使用channelfactory – Chada
不可以在沒有證書的情況下使用用戶名和密碼。此外,用戶名和密碼沒有證書=沒有安全。 –
如果您需要在客戶端啓動安全性,請配置您正在實例化的「NetTcpBinding」。這是你應該能夠[文檔](http://msdn.microsoft.com/en-us/library/system.servicemodel.nettcpbinding.aspx) –