2012-07-11 290 views
7

ServicePointManager.ServerCertificateValidationCallback是一個全球性的靜態屬性可以通過在應用程序代碼的任何位覆蓋簡單地做:設計ServicePointManager.ServerCertificateValidationCallback的原理是什麼?

ServicePointManager.ServerCertificateValidationCallback 
    = (sender, cert, chain, sslPolicyErrors) => true; 

爲什麼他們決定實現這種方式?當然,它應該是WebRequest對象上的一個屬性,並且對於爲什麼忽略證書應該有一個很好的理由。

+0

那麼你抱怨的是,這是一個靜態屬性,而不是一個實例屬性,很難在應用程序的獨立部分使用不同的策略? – CodesInChaos 2012-07-11 11:53:05

+2

不,這是因爲你使用SDK等任何第三方代碼都可以覆蓋你的回調。 – superlogical 2012-07-11 11:54:41

+0

這對我來說不是一個真正的問題。你只是抱怨不必要的使用全局可變狀態。 – CodesInChaos 2012-07-11 11:59:24

回答

5

能夠設置此屬性的其他代碼不是安全問題,因爲設置屬性需要SecurityPermissionFlag.Infrastructure權限,您不需要授予您不信任的代碼的權限。

另一方面,我同意這是糟糕的設計,因爲它是全局可變狀態,應該避免。特別是它使得在程序的不同部分使用不同的驗證策略變得不必要地困難。正如你所建議的那樣,一個共享的配置文件會使IMO更糟糕。

正確的選擇將是回調的實例屬性,就像普通的類SslStream類所使用的一樣。我對框架的這一部分不太熟悉,不知道這個屬性是否存在,因此ServicePointManager.ServerCertificateValidationCallback只能作爲默認值,或者這個全局變量是影響證書驗證的唯一方法。