本文說明在部分信任環境中執行 Windows Communication Foundation (WCF) 時的最佳做法。
序列化
在部分信任的應用程式中使用 DataContractSerializer 時,請套用這些做法。
所有可串行化類型都必須以 屬性明確標示 [DataContract]
。 部分信任環境中不支援下列技術:
- 標記以 SerializableAttribute 序列化的類別。
- 實作 ISerializable 介面以允許類別控制其串行化程式。
使用 DataContractSerializer
以
[DataContract]
屬性標示的所有類型都必須是公用的。 非公用類型無法在部分信任環境中序列化。可序列化
[DataContract]
類型中的所有[DataContract]
成員必須是公開的。 具有非公用[DataMember]
的類型無法在部分信任環境中串行化。處理串行化事件的方法(例如
OnSerializing
、、OnSerialized
OnDeserializing
和OnDeserialized
)必須宣告為公用。 不過,支持明確和隱含的實作 OnDeserialization(Object)。[DataContract]
在標示為 AllowPartiallyTrustedCallersAttribute 的元件中實作的型別不得在型別建構函式中執行安全性相關動作,因為 DataContractSerializer 不會在還原串行化期間呼叫新具現化物件的建構函式。 具體而言,對於[DataContract]
類型,必須避免使用以下常見的安全性技術:嘗試將型別的建構函式設為內部或私用,以限制部分信任存取。
將 加入
[LinkDemand]
至型別的建構函式,以限制對型別的存取。假設物件已成功具現化,建構函式強制執行的任何驗證檢查都已成功通過。
使用 IXmlSerializable
下列最佳做法適用於實作IXmlSerializable並使用DataContractSerializer進行序列化的類型:
GetSchema靜態方法實作必須是
public
。實作 介面的 IXmlSerializable 實例方法必須是
public
。
使用來自完全信任平台程式代碼的 WCF,允許來自部分信任呼叫端的呼叫
WCF 部分信任安全性模型假設 WCF 公用方法或屬性的任何呼叫端都正在裝載應用程式的程式代碼存取安全性 (CAS) 內容中執行。 WCF 也假設每個 AppDomain 都只有一個應用程式安全性內容存在,而且此內容是在 AppDomain 建立時由受信任的主機所建立(例如,透過呼叫 CreateDomain 或由 ASP.NET 應用程式管理員所建立)。
備註
.NET Framework 和 .NET 的所有版本中,代碼存取安全性(CAS)已被棄用。 當使用 CAS 相關 API 時,最新版本的 .NET 不會接受 CAS 註釋,並會產生錯誤。 開發人員應該尋求替代方式來完成安全性工作。
此安全模型適用於使用者撰寫的應用程式,這些應用程式無法主張其他 CAS 許可權,例如在中等信任 ASP.NET 應用程式中執行的使用者程式碼。 不過,完全信任的平台程序代碼(例如,安裝在全域程式集緩存中的第三方元件,並接受部分信任程式代碼的呼叫),在代表部分信任的應用程式呼叫WCF時必須明確小心,以避免引入應用層級安全性弱點。
完全信任程式代碼應該避免在代表部分信任的程式代碼呼叫 WCF API 之前,變更目前線程的 CAS 許可權集合(藉由呼叫 Assert、 PermitOnly或 Deny)。 斷言、拒絕或以其他方式創建線程的特定許可權上下文,獨立於應用程式層級的安全性上下文,可能導致非預期的行為。 視應用程式而定,此行為可能會導致應用層級安全性弱點。
使用線程特定權限內容呼叫 WCF 的程式代碼必須準備好處理可能發生的下列情況:
在作業期間,線程特定的安全性內容可能無法維護,這會導致潛在的安全性例外狀況。
內部 WCF 程式碼和任何使用者提供的回呼,可能在與最初起始呼叫時不同的安全性內容中執行。 這些情境包括:
應用程式許可權背景。
先前由其他使用者線程所建立的任何線程特定許可權內容,用來在目前執行 AppDomain的存留期內呼叫WCF。
WCF 保證部分信任的程式代碼無法取得完全信任的許可權,除非呼叫 WCF 公用 API 之前,有完全信任的元件宣告或授予這類許可權。 不過,它並不保證宣告完全信任的效果會被隔離至特定線程、操作或用戶動作。
請避免呼叫Assert、PermitOnly或Deny,以防建立線程特定的許可權內容。 相反地,授與或拒絕應用程式本身的許可權,因此不需要 Assert、 Deny或 PermitOnly 。