如何通过安全地签署公共令牌密钥来使InternalsVisibleTo属性起作用?

时间:2011-08-25 13:38:51

标签: c# .net visual-studio unit-testing internalsvisibleto

我试图通过使用:

向我的单元测试项目公开一些内部结构
[assembly: InternalsVisibleTo("MyTest")]

但我收到错误:

  

错误1朋友程序集引用MyTest'无效。强名称   签名的程序集必须在其中指定一个公钥   InternalsVisibleTo声明。 ... / MyClass.cs ...

当我手动分配PublicTokenKey时:

[assembly: InternalsVisibleTo("MyTest, PublicKeyToken=XxxxxYysakf")]

解决方案构建没有任何错误。

  1. 为什么我需要包含公钥令牌?
  2. 我不确定是否会通过包含公钥令牌来破坏生产中的某些内容。
  3. 那么,为我的Test项目分配公钥的最佳和最安全的方法是什么?

1 个答案:

答案 0 :(得分:7)

我很惊讶PublicKeyToken甚至有效 - 在我的机器上它迫使我使用PublicKey

  1. 您需要公钥令牌的原因是因为可以将具有强名称的程序集放入GAC中 - 这具有很高的信任度。如果任何名为“MyTest”的程序集(可能不受信任 - 例如浏览器中的控件)可能会调用GACed程序集的内部,那将是一个安全漏洞。它想要公钥来防止这种类型的黑客攻击。

  2. 这不会破坏生产中的任何东西 - 即使无法找到装配体。此属性在编译时使用,而不是在运行时使用。

  3. 最安全的方法是什么?

    如果您真的担心它会破坏生产代码,请在发布版本中删除该属性:

    #if (DEBUG || TEST)
    [assembly: InternalsVisibleTo("MyTest, PublicKeyToken=XxxxxYysakf")] 
    #endif
    

    如果您有一些需要公钥令牌的项目(并且您有一个密钥对,您应该这样做),您还可以定义一个文件,例如AssemblyInfo.global.cs,并将其作为链接文件添加到所有你的项目:

    class KeyTokens
    {
       public const string Global = ", PublicKeyToken=XxxxxYysakf";
    }
    

    这简化了事情(特别是如果你需要使用真的长的PublicKey):

    #if (DEBUG || TEST)
    [assembly: InternalsVisibleTo("MyTest" + KeyTokens.Global)] 
    [assembly: InternalsVisibleTo("HisTest" + KeyTokens.Global)] 
    [assembly: InternalsVisibleTo("TheirTest" + KeyTokens.Global)] 
    #endif