ClickOnce部署(5):自定义安全权限

今天我们来探讨一下在ClickOnce部署中如何严格控制应用程序的权限。

演示应用

为了在下文中能更好地演示,我们先要做一个测试项目。也为了显得简单易懂,我使用最常用且最常见的WinForm项目,这是地球上最丰富的物种。

咱们做一个MD5的计算程序,这个应该够简单了吧?程序的功能是浏览打开一个文件,然后计算它的MD5,最后以字符串的形式输出。

界面大致这样:

其中用来输入文件名的文本框叫txtInput,用来显示计算结果的文本框叫txtOutput,为了方便输入文件名,我们在输入文本框的右侧放一个按钮,点击后通过OpenFileDialog来浏览文件。

然后处理的代码如下:

using System;

……

using System.Windows.Forms;

using System.Security.Cryptography;

using System.IO;

namespace md5ComputeApp

{

public partial class Form1 : Form

{

……

private void button1_Click(object sender, EventArgs e)

{

if (File.Exists(this.txtInput.Text) == false)

{

MessageBox.Show("靠,文件不存在,计算条毛啊。"); return;

}

MD5 md5 = new MD5CryptoServiceProvider();

// 打开文件流

FileStream fs = File.OpenRead(txtInput.Text);

// 开始计算

byte[] dataBuffer = md5.ComputeHash(fs);

// 关闭流

fs.Close();

fs.Dispose();

fs = null;

// 转换为字符串

StringBuilder bd = new StringBuilder();

foreach (byte b in dataBuffer)

{

bd.Append(b.ToString("x2"));

}

// 显示结果

this.txtOutput.Text = bd.ToString();

}

private void btnBrowser_Click(object sender, EventArgs e)

{

if (this.openFileDialog1.ShowDialog().Equals(DialogResult.OK))

{

this.txtInput.Text = this.openFileDialog1.FileName;

}

}

}

}

好,运行一下,试试是否达到预期效果。如下图:

OK,相当Nice,基本符合要求了。接下来我们就要对其进行部署了。

完全信任权限

部署我们肯定都会,而且前面我们也介绍过了。不过这一次我们重点是设置安全权限。为了保护我们的程序不被别有用心的人拿来干坏事,有时候我们没有必要让应用程序具有过高的权限。

在项目属性窗口中,切换到"安全性"选项卡,勾选"启用ClickOnce安全设置"复选框,然后下面的几个单选项就变为可用状态。我们保持选中第一个,即"这是完全可信的应用程序"。最后保存。

现在我们部署这个应用程序,相信大家都会了,就是切换到"发布"选项卡来完成,和前面所讲的方法一样。

安装后我们看到程序正常运行了。

部分可信任权限

所谓部分可信任,就是相对我们前面的完全信任权限而言的,即应用程序不具备所有权限,比如,可能只允许应用程序访问D盘下的文件,或者说不允许应用程序进行反射操作等。

要知道有哪些权限可以自定义也很简单,打开"对象浏览器"窗口找到System.Security.IPermission接口,然后我们查看实现它的类,以及这些类的子类,一层一层往下翻,那些命名为XXXPermission的类就是对应的权限了。除此之外,我们还会看到一些Attribute,如FileDialogPermissionAttribute,即它们的命名规律是XXXPermissionAttribute,我们只要找到这些规律,后面在配置权限时就好办了。

现在,我们先不管权限如何配置,因为VS默认会为我们定义两个权限集。依旧,打开项目属性窗口,同样切换到"安全性"选项卡,这一次我们选择"部分信任的应用程序",如下图所示:

在"要从中安装应用程序"下面的下拉列表框,为我们预定义了两种权限集,一种是内部Intranet,一种是广域Internet。我们可以根据具体情况来选。

这里顺便告诉大家,这几个预定义的权限集在哪里。打开C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\PermissionSets目录,你会看到有三个XML文件,和上面安全性配置上的"完全信任",部分信任中的"Internet"、"Intranet"相对应。我这里是.NET 4.5.1,具体看你安装的版本。

FullTrust.xml——表示完全信任的权限配置。

Internet.xml——表示Internet上的应用的权限配置。

LocalIntranet.xml——本地Intranet的权限配置。

我们可以打开这些XML文件看看里面有些什么。

从中我们看到,每一项权限都是一个IPermission节点,这个IPermission是不是有点熟悉?对的,上面我们说过的一个接口,与权限配置有关的类都实现该接口。也就是说,自定义应用程序的权限,就是编写相应的XML节点。

从MSDN的参考文档(参考地址:http://msdn.microsoft.com/ZH-CN/library/vstudio/ws1c2fch(v=vs.110).aspx)我们知道,权限集的配置在trustInfo元素下的security/applicationRequestMinimum/PermissionSet节点下,层次结构我们可以参考文档。

好,我们来实战一下,这样讲还是觉得很抽象,再次打开项目属性,切换到"安全性"选项卡。选择部分信任选项,在"将要从中安装应用程序的区域"下面的下拉列表框中选择"自定义",这时候,右边的"编辑权限XML"按钮变为可用状态。如下图:

我们不妨单击这个按钮,来查看XML文件,结合XML文件上的注释和文档说明,基础较好的朋友估计已经明白怎么用了。

现在呢,不对XML文件进行任何修改,然后我们发布并安装应用程序。结果我们发现,应用程序没运行,手动到"开始"组中启动它也没有运行,这是很多朋友都遇到的问题,ClickOnce应用安装后不能运行。其实问题就出在权限上。刚才我们使用自定义权限集来发布应用程序,而我们又没有配置任何权限,就等于应用程序不具有任何权限,当然没法运行。

回到项目属性窗口的"安全性"选项卡,点击"编辑权限XML"按钮。

这时候就打开应用程序清单文件,我们找到trustinfo节点。找到PermissionSet节。如下图:

注意PermissionSet节的ID要与defaultAssemblyRequest.permissionSetReference的值一致,这里已经为我们生成了Custom。

我们要做的就是在PermissionSet下添加IPermission元素,这个元素怎么写呢?看文档。Version属性为1,我们只需设置class即可,需要赋给应用程序什么权限,就写上类的完整标识符,包括程序集和版本,公钥等。

前面我为什么要介绍在对象浏览器中查看IPermission派生的类,就是为这里打下伏笔的。

IPermission元素所属性并不只是class、version这几个,它可以和对应的类的属性进行合并,即XXXPermission和XXXPermissionAttribute的属性可以进行合并,如FileIOPermission类有个AllFiles属性,FileIOPermissionAttribute类有个Read属性,我们就可以把它们合起来用,即:

<IPermission class=" System.Security.Permissions.FileIOPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" AllFiles="Read", Read="c:\" />

下面我们来为本示例的应用程序来配置一下权限,让它可以顺利地运行起来。

首先,我们在PermissionSet元素下添加以下两个权限:

<IPermission class="System.Security.Permissions.UIPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"

version="1"

Unrestricted="true"/>

<IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"

Flags="Execution, BindingRedirects"/>

这些类绝大部分位于mscorlib程序集内,我们进行复制就行了,至于说如何查看publickey等参数,我可以向大家说一种方法。打开VS的命令行工具窗口,当然,打开cmd也行,只要路径定义对就行了。输入以下命令:

Gacutil /l mscorlib >>d:\123.txt

执行后就可以在d盘下的123.txt文件中输出结果,我们打开那个文本文件就可以把结果进行复制了。

后面的processorArchitecture是指CPU架构,这个不用复制

哦,还有,如果大家觉得去打开命令行工具麻烦,可以把常用的工具都集成到VS中,方法是在VS窗口中执行菜单【工具】-【外部工具】,随后弹出窗口,然后我们单击"添加"按钮。

标题输入如"开发人员命令行工具",随便填,你自己知道什么意思就行。

命令输入%ComSpec%,即cmd,记住首尾两个百分号不要掉了。

参数输入/k ""C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\VsDevCmd.bat""。注意是双重引号,你没看错。如下图:

然后确定保存,以后你只需在VS中执行【工具】菜单,就会看到【VS命令行工具】项了,这样来打开就方便多了。

好了,说了很多废话,还是回到我们的正题,上面我们为应用程序清单定义了两个权限:

UIPermission:这是必须的,没有它应用程序界面就无法显示,你看它的名字就知道它的用途了。

SecurityPermission:它的Flags属性可以是多个枚举值合并,在XML配置中我们可以用逗号分隔多个值,注意是英文的逗号,不解释。Execution是少不的,没有它就没法运行应用程序,BindingRedirects还是加上好一点,有时候读取配置文件时要用到。

好,现在我们再次发布并安装应用程序,兴奋吧,程序终于运行起来了。如下图:

不过,当我们单击右边的按钮浏览文件时,就发生错误了。

这个错误也是没有权限造成的,回到项目,在清单文件上,我们继续添加可以操作文件对话框的权限。

再添加以下两个权限:

<IPermission class="System.Security.Permissions.FileDialogPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"

Access="Open"

Unrestricted="true"/>

<IPermission class="System.Security.Permissions.FileIOPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"

All="Read"

Unrestricted="true"/>

FileDialogPermission的Access为Open表示允许使用打开文件对话框,但光这个还不够,因为我们在计算MD5时要读取文件的内容,所以,还要加一个FileIOPermission权限,All为Read表示程序对文件只有读的权限,不能写,对于我们的MD5计算器来说够了。Unrestricted设置为true把权限完全赋给程序以免应用程序在运行时申请权限失败。

我们再次发布并安装应用程序,这一次看看能不能完成程序的功能。

这回正常了,高兴一下吧。

经过本节的演示,我们发现,完全自定义权限是相当麻烦的一件事,一般情况下我们不需要这样做,可以优先考虑不使用安全设置,或者使用预定义的权限。除非你确实需要严格控制,才会用自定义权限的方法。本节的演示也好让大家熟悉一下ClickOnce部署中分配权限的方法。

时间: 2024-08-27 08:01:31

ClickOnce部署(5):自定义安全权限的相关文章

ClickOnce部署(4):下载多个安装包

有时候,我们可能会一次性发布多个安装包,当然在网页上多加几个链接让用户逐个安装也是可取的.不过,也可以弄得更方便些,即用户先安装一个,作为一个"引导程序",然后通过这个程序去下载安装其他应用程序. 我们还是说说真实的例子,这样好理解一点.假设我开发了两个应用程序,一个叫App1,另一个叫App2.我把这两个应用程序同时发布. 我们可以在IIS服务器的根目录下新建两子目录,我们分别把这两个应有程序发布到这两个文件夹下,如下面两张截图所示. 第一个应用 第二个应用 最后,重点是如何做这个&

ClickOnce部署(3):使用证书

在讲述证书的使用前,我们先来了解另外一个知识--发布网页. 在前面所说的ClickOnce部署中,如果大家细心的话,应该会发现这么个问题. 如上图,发布成功后,在"输出"窗口中提示无法查看发布网页. 好,我们先不管那是什么,现在我们不妨发布一个项目,但在"项目属性"窗口中的"发布"选项卡上,点击"选项"按钮,打开"发布选项"对话框. 在"说明"页中输入基本信息,产品名称和发布者. 然后进

ClickOnce 部署 API 按需下载程序集

在设计器中使用 ClickOnce 部署 API 按需下载程序集 参考教程: http://msdn.microsoft.com/zh-cn/library/ak58kz04.aspx?cs-save-lang=1&cs-lang=vb#code-snippet-2 代码下载: http://download.csdn.net/detail/xinqinglhj/8101331

ClickOnce部署疑难杂症:更新时部署与应用程序标识不一致问题。要安装此应用程序,请修改此文件的清单版本或卸载之前存在的应用程序。

使用ClickOnce部署winform应用程序.无论是安装或者自动更新都极为方便,但有时候一些疑难杂症也令人头疼 1.注意每次部署完成之后 setup.exe无需覆盖,只需要在Application.File中将最新的发布程序包拷进去,把*soft.application文件覆盖掉即可 2.部署与应用程序标识不一致问题,如下图的发布选项千万别乱动,否则客户会全部升级错误, 准备正式发布出去的时候这里一定要想清楚,千万别发布完了才想到改,那时候就晚了,这是血的教训啊! 3. 无法安装此应用程序,

C# ClickOnce deployment for Windows Services ClickOnce 部署windows service

A simple solution that I use is to merely stop the service and x-copy the files from my bin folder into the service folder. A batch file to stop the service then copy the files should be easy to throw together. Net stop myService xcopy \\myServerWith

drupal自定义node权限

使用HOOK_node_access_records    和    HOOK_node_grants(图形化组合(个人理解没有权威性,仅供参考)) 这两个钩子 代替 HOOK_node_access 1/ 首先介绍下HOOK_node_access  他是用写代码的方式来判断用户有没有权限来访问,编辑,删除一个node的权限,如下: function modulename_node_access($node, $op, $account) { //这里根据你的条件做以下返回 return NO

Excel催化剂开源第4波-ClickOnce部署要点之导入数字证书及创建EXCEL信任文件夹

Excel催化刘插件使用Clickonce的部署方式发布插件,以满足用户使用插件过程中,需要对插件进行功能升级时,可以无痛地自动更新推送新版本.但Clickonce部署,对用户环境有较大的要求,前期首次安装,比较波折,但相对于后续的自动更新的回报,笔者自我感觉还是很值得的.Clickonce部署过程中,要求导入数字证书和设置Excel共享路径这两个步骤,本篇开源代码主要讲述这个过程的自动化处理的代码实现,同样用的是Console程序. 为了还原一个干净无侵扰的网络世界,本文将不进行大规模地分发,

【Android进阶篇】自定义应用权限

在Android里,不是只有网络.信息.蓝牙等会受到保护,我们需要申请权限才能访问,我们自己编写的应用也可以受到Android系统的保护,让其他应用也需要先获取权限才能访问.下面介绍一下如何给应用的Activity自定义权限. 我们会通过三步来实现: 首先,创建两个Android项目,第二个访问第一个的Activity: 然后,给第一个应用的Activity的设置权限,再让第二个访问,看会发生什么 最后,是第二个应用获取了权限后再访问第一个应用的Activity. 实例步骤: 1. 创建Andr

Zabbix快速部署及自定义Item监控Nginx状态原理

监控软件的选择 1)Nagios 优点:监控协议多.完善的告警机制.服务抖动检测 缺点:只能在终端配置.基于文件的配置方式.不方便扩展.易读性差.管理耗时 2)Cacti 优点:多样的图形化数据.历史数据存储.趋势对比 缺点:报警机制不完善.只支持集中式数据监控 3)Zabbix 优点:集合了Nagios和Cacti大部分优点,功能强大:特别是在针对集群机器较多.业务环境复杂和跨机房监控方面有优势(proxy收集功能) 缺点:部署稍微复杂,不支持服务抖动检测等... Zabbix特点 · 多种数