2012-07-11 294 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只能作为默认值,或者这个全局变量是影响证书验证的唯一方法。