ClickOnce困境:代码身份与安全性 - 怎么办?

时间:2011-04-07 14:00:37

标签: c# wpf winforms deployment clickonce

我们的应用程序生命周期管理还有很大的改进空间。我们不使用TFS或任何其他套件(我知道,对我们感到羞耻)。

无论如何,我们目前正在思考的一个方面是代码身份。 换句话说:审计员询问我们如何确保部门测试和接受的软件是完全正确的,并且没有替代我们为生产使用而部署的程序集,而不是一些修补版本。 “这很容易”,我们说,“它不是!”。因为在批准和发布之间设置了一些配置变量,所以ClickOnce哈希值不同,从而完成整个过程。

到目前为止,这就是故事,但我们希望(并且有)在我们的工作中做得更好,因此无法创建无状态且无视环境的程序集。但是我们必须在运行时设置环境,我们的选项是:

  1. 使用应用程序设置并从ClickOnce哈希中排除应用程序配置。这很糟糕,因为我们无法以这种方式签署ClickOnce Manifest,因此用户将始终被提示“注意,你不知道这个人”的那种消息。

  2. 将Query-String参数传递给应用程序文件,并使用它们来区分测试环境和生产环境。我不喜欢这个,因为它太开放了,任何用户都可以控制重要的位(比如dbhost或其他)。

  3. 传递类似“is_test = 1”的东西意味着有很多内联切换正在进行,而另一方面可能意味着程序集在生产中的行为与测试中的行为不同,这使我们重新回到起点,虽然我们已经确保了装配身份。

    我认为所有这些都令人不满意,必须有更好的方法来做到这一点。如何通过一点点手段(意味着没有TFS或类似的怪物)来做到这一点?

1 个答案:

答案 0 :(得分:1)

我刚刚搞砸了ApplicationDeployment类。我认为我现在拥有的非常接近我所寻找的东西。

    private static void GetDeploymentEnvironment()
    {
        if (ApplicationDeployment.IsNetworkDeployed)
        {
            ApplicationDeployment dep = ApplicationDeployment.CurrentDeployment;
            FileInfo f = new FileInfo(dep.UpdateLocation.AbsolutePath + ".env");
            if (f.Exists)
            {
                /// read file content and apply settings
            }
        }
    }

这使我能够将文件放在部署文件夹(.application-file所在的文件夹)中,我可以用它来覆盖设置。如果没有这样的文件,那么......什么都没有被覆盖。无论我如何处理此文件的内容,都会保留程序集标识。

编辑:只是一个提示,因为您看到这仅对部署为 仅限在线 的应用程序有用。您无法在 可用离线 方案中的不同位置启动相同的ClickOnce .application文件。