2012-02-09 101 views
0

我有一個WCF服務,我嘗試設置一組憑據,以便它們不僅用於服務,還用於NAS上的所有後續操作。如何在WCF服務上要求模仿並從服務內設置憑證?

我目前已經在該方法上設置了屬性[OperationBehavior(Impersonation = ImpersonationOption.Required)],並在服務web.config中設置了<identity impersonate="true" userName="DOMAINUSER" password="PASSWORD"/>。由於這是一項內部服務,我不想要消費者提供特殊憑據,所以我想使用<basicHttpBinding><security mode="None">。問題是,這樣設置的,當我收到錯誤:

The contract operation requires Windows identity for automatic impersonation. 
A Windows identity that represents the caller is not provided by 
binding 'BasicHttpBinding' for contract. 

如上設置,返回WindowsIdentity.GetCurrent().Name是NT AUTHORITY \ NETWORK SERVICE儘管具有模擬指令在web.config設置。它似乎希望從消費者/客戶端傳遞憑證,而不是從服務中設置。

是否有可能讓模擬完全包含在服務中,而不是依賴消費者發送憑證?

謝謝!

回答

1

是的,這是可能的,但它不是通過任何配置完成。你目前使用的是WCF模擬,其目標只是模仿客戶的身份。

你想要的是使用不同的賬戶(可能基於某種邏輯)訪問遠程存儲。首先,它不是非常安全的方式,因爲它需要存儲用於在某些配置文件或註冊表中訪問這些資源的帳戶和密碼(或者更糟糕的是 - 硬編碼它們)。您應該使用專爲您的應用程序創建的特殊帳戶運行您的服務,並且此帳戶應具有您需要的每種資源的必要權限。

無論如何您需要登錄your specific account and impersonate it。據我所知.NET沒有登錄的API - 你必須使用interop並調用Win API LogonUser方法。

+0

非常感謝您的確認。我懷疑這與我如何期待這種冒充行爲有關。是否可以創建/修改正在使用的WindowsIdentity,並在using()語句中使用它來執行應用程序的所需部分? – McArthey 2012-02-10 20:22:23

1

設置你的服務的方法此屬性:

[OperationBehavior(模擬= ImpersonationOption.Required)]

意味着服務代碼將模擬客戶端的身份。所以,如果你不想使用調用客戶端的證書(它似乎是這種情況),那麼你想離開你的服務方法的這個屬性。

聽起來像是你希望你的服務作爲特定的身份運行,而不管客戶的身份。

如果設置爲<identity impersonate="true" userName="DOMAINUSER" password="PASSWORD"/>'無效,您可以更改IIS中運行應用程序的應用程序池的標識。這將導致您的應用程序隨時以該身份運行,前提是沒有將服務方法設置爲明確要求模擬。