共用方式為


WCF 中安全性的最佳做法

下列各節列出使用 Windows Communication Foundation 建立安全應用程式時要考慮的最佳做法(WCF)。 如需安全性的詳細資訊,請參閱 安全性考慮數據的安全性考慮,以及 元數據的安全性考慮

識別使用SPN執行 Windows 驗證的服務

服務可以使用用戶主體名稱 (UPN) 或服務主體名稱 (SPN) 來識別。 在像網路服務這類系統帳戶下執行的服務,其 SPN 身分識別會對應至運行這些服務的電腦。 在使用者帳戶下執行的服務具有與執行的使用者相對應的 UPN 身分識別,雖然可以使用 setspn 工具來將 SPN 指派給用戶帳戶。 設定服務以便透過SPN加以識別,並將連線到服務的客戶端設定為使用SPN,可讓某些攻擊更加困難。 本指南適用於使用 Kerberos 或 SSPI 協商的系結。 在 SSPI 回復至 NTLM 的情況下,用戶端仍應指定 SPN。

驗證 WSDL 中的服務識別

WS-SecurityPolicy 可讓服務在元數據中發佈自己身分識別的相關信息。 透過svcutil或其他方法如WsdlImporter擷取時,此身分識別資訊會轉譯為WCF服務端點位址的身分識別屬性。 未驗證這些服務身分識別正確且有效的用戶端會有效略過服務驗證。 惡意服務可以藉由變更其 WSDL 中宣告的身分識別,利用這類客戶端來執行認證轉送和其他「中間人」攻擊。

使用 X509 憑證,而不是 NTLM

WCF 提供了兩種 peer-to-peer 驗證機制:X509 憑證(由對等通道使用)和 Windows 驗證,在此過程中,SSPI 協商會從 Kerberos 降級至 NTLM。 使用金鑰大小為 1024 位或更多位的憑證式驗證,是 NTLM 的慣用,原因有數個:

  • 相互驗證功能的可用性,

  • 使用更強大的密碼編譯演算法,以及

  • 使用已轉送 X509 憑證的困難度更高。

一律在偽裝之後還原

使用啟用客戶端身份模擬的 API 時,請務必恢復原始身份。 例如,使用 WindowsIdentityWindowsImpersonationContext時,請使用 C# using 語句或 Visual Basic Using 語句,如下列程式代碼所示。 類別 WindowsImpersonationContext 會實作 IDisposable 介面,因此,一旦程式代碼離開 using 區塊,Common Language Runtime (CLR) 就會自動還原為原始身分識別。

WindowsIdentity identity = ServiceSecurityContext.Current.WindowsIdentity;
using (identity.Impersonate())
{
    // Run code under the caller's identity.
}
Dim identity = ServiceSecurityContext.Current.WindowsIdentity
Using identity.Impersonate()
    ' Run code under the caller's identity.
End Using

僅視需要模擬

使用Impersonate類別的WindowsIdentity方法,可以在範圍非常受控制的條件下進行身份模擬。 這與使用 ImpersonationOperationBehaviorAttribute 屬性相反,此屬性可允許在整個作業範圍內進行模擬。 盡可能使用更精確的 Impersonate 方法來控制仿真的範圍。

從信任的來源取得元數據

請確定您信任元數據的來源,並確定沒有人竄改元數據。 使用 HTTP 通訊協定擷取的元數據會以純文字傳送,而且可能會遭到竄改。 如果服務使用 HttpsGetEnabledHttpsGetUrl 屬性,請使用服務建立者提供的 URL,以使用 HTTPS 通訊協定下載數據。

通過安全性發佈元數據

若要防止竄改服務的已發佈元數據,請使用傳輸或訊息層級安全性來保護元數據交換端點。 如需詳細資訊,請參閱 發佈元數據端點如何:使用程式代碼發佈服務的元數據

確保使用本地簽發者

如果指定了某個系結的簽發者地址和系結,則使用該系結的端點不會使用本機簽發者。 預期始終使用本地簽發者的客戶端應確保不使用此類繫結,或修改繫結以使簽發者位址為空值。

SAML 令牌大小配額

當安全性判斷提示標記語言 (SAML) 令牌在訊息中串行化時,當安全性令牌服務 (STS) 發出令牌時,或當用戶端將其呈現為驗證的一部分時,訊息大小上限配額必須足夠大,以容納 SAML 令牌和其他訊息部分。 在一般情況下,預設訊息大小配額就已足夠。 不過,如果 SAML 令牌因為包含數百個宣告而很大,則應增加配額以容納序列化的令牌。 如需配額的詳細資訊,請參閱 數據的安全性考慮

在自定義系結上將 SecurityBindingElement.IncludeTimestamp 設定為 True

當您建立自訂系結時,必須將 設定 IncludeTimestamptrue。 否則,如果 IncludeTimestamp 設定為 false,且用戶端使用非對稱密鑰型令牌,例如 X509 憑證,則不會簽署訊息。

另請參閱