编写高质量代码改善C#程序的157个建议——建议121:为应用程序设定运行权限
建议121:为应用程序设定运行权限
在某些情况下,可能存在这样的需求:只有系统管理员才能访问某应用程序的若干功能。这个时候,可以结合.NET中提供的代码访问安全性(Code Access Security)和基于角色(Role-Based Security)的安全性去实现。
如果要通过一下的代码正常的访问类型SampleClass,用户必须以Administrator的身份运行代码:
class Program
{
static void Main()
{
AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
SampleClass sample = new SampleClass();
Console.WriteLine("代码成功运行...");
}
} [PrincipalPermission(SecurityAction.Demand, Role = @"Administrator")]
//[PrincipalPermission(SecurityAction.Demand, Role = @"Users")]
class SampleClass
{ }
如果恰巧我们是以User用户组的用户登录系统的,则会抛出异常System.Security.SecurityException:对主体权限的请求失败。只要还原上文中的那条注释的属性,就能让代码正确运行。
可以为类型增加多条PrincipalPermission属性,多个PrincipalPermission属性之间是“OR”的关系。
对于代码的控制可以细化到方法,代码如下:
class Program
{
static void Main()
{
AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
SampleClass sample = new SampleClass();
sample.SampleMethod();
sample.SampleMethodSec();
Console.WriteLine("代码成功运行...");
}
} class SampleClass
{
public void SampleMethod()
{
Console.WriteLine("执行方法SampleMethod");
} [PrincipalPermission(SecurityAction.Demand, Role = @"Administrator")]
//[PrincipalPermission(SecurityAction.Demand, Role = @"Users")]
public void SampleMethodSec()
{
Console.WriteLine("执行方法SampleMethodSec");
}
}
这段代码如果不是以Administrator身份运行的,则在执行完毕SampleMethod方法后也会抛出SecurityException。
除了使用Windows用户和角色,我们还可以使用用户自定义的主体。比如在一个考试系统中,只有教师才能修改成绩,而考生只能具备浏览功能。为了充分了解代码的机制,以下代码我们不用属性声明的方式:
class Program
{
static void Main()
{
GenericIdentity examIdentity = new GenericIdentity("ExamUser");
//String[] Users = { "Teacher", "Student" };
String[] Users = { "Student" };
GenericPrincipal MyPrincipal = new GenericPrincipal(examIdentity, Users);
Thread.CurrentPrincipal = MyPrincipal;
ScoreProcessor score = new ScoreProcessor();
score.Update();
}
} class ScoreProcessor
{
public void Update()
{
try
{
PrincipalPermission MyPermission = new PrincipalPermission("ExamUser", "Teacher");
MyPermission.Demand();
//省略
Console.WriteLine("修改成绩成功");
}
catch (SecurityException e)
{
Console.WriteLine(e.Message);
}
}
}
以上代码运行时会抛出异常,因为我们在调用Update方法的时候只配置了Student组。要使代码能够成功运行,应该在调用处使用注释掉的那行代码。
转自:《编写高质量代码改善C#程序的157个建议》陆敏技
编写高质量代码改善C#程序的157个建议——建议121:为应用程序设定运行权限的更多相关文章
- 博友的 编写高质量代码 改善java程序的151个建议
编写高质量代码 改善java程序的151个建议 http://www.cnblogs.com/selene/category/876189.html
- 编写高质量代码--改善python程序的建议(六)
原文发表在我的博客主页,转载请注明出处! 建议二十八:区别对待可变对象和不可变对象 python中一切皆对象,每一个对象都有一个唯一的标识符(id()).类型(type())以及值,对象根据其值能否修 ...
- 编写高质量代码--改善python程序的建议(八)
原文发表在我的博客主页,转载请注明出处! 建议四十一:一般情况下使用ElementTree解析XML python中解析XML文件最广为人知的两个模块是xml.dom.minidom和xml.sax, ...
- 编写高质量代码改善java程序的151个建议——导航开篇
2014-05-16 09:08 by Jeff Li 前言 系列文章:[传送门] 下个星期度过这几天的奋战,会抓紧java的进阶学习.听过一句话,大哥说过,你一个月前的代码去看下,慘不忍睹是吧.确实 ...
- 编写高质量代码改善python程序91个建议学习01
编写高质量代码改善python程序91个建议学习 第一章 建议1:理解pythonic的相关概念 狭隘的理解:它是高级动态的脚本编程语言,拥有很多强大的库,是解释从上往下执行的 特点: 美胜丑,显胜隐 ...
- 编写高质量代码改善C#程序的157个建议[1-3]
原文:编写高质量代码改善C#程序的157个建议[1-3] 前言 本文主要来学习记录前三个建议. 建议1.正确操作字符串 建议2.使用默认转型方法 建议3.区别对待强制转换与as和is 其中有很多需要理 ...
- 编写高质量代码改善程序的157个建议:第87个建议之区分WPF和WinForm的线程模型
今天有时间了,继续<编写高质量代码改善程序的157个建议>的阅读,当我阅读到建议87的时候,里面的一些代码示例和文中所说的不一致了,是不是我现在用的是NetFramework 4.0的缘故 ...
- 编写高质量代码改善java程序的151个建议——[1-3]基础?亦是基础
原创地址: http://www.cnblogs.com/Alandre/ (泥沙砖瓦浆木匠),需要转载的,保留下! Thanks The reasonable man adapts himse ...
- 编写高质量代码:改善Java程序的151个建议 --[117~128]
编写高质量代码:改善Java程序的151个建议 --[117~128] Thread 不推荐覆写start方法 先看下Thread源码: public synchronized void start( ...
- 编写高质量代码:改善Java程序的151个建议 --[106~117]
编写高质量代码:改善Java程序的151个建议 --[106~117] 动态代理可以使代理模式更加灵活 interface Subject { // 定义一个方法 public void reques ...
随机推荐
- ceph---luminous版的安装
前言 ceph luminous版本新增加了很多有意思的功能,这个也是一个长期支持版本,所以这些新功能的特性还是很值得期待的,从底层的存储改造,消息方式的改变,以及一些之前未实现的功能的完成,都让ce ...
- GridControl 添加全选列
这里通过List对象绑定GridControl,且不用在GirdControl界面中添加任何列,实现CheckBox列的方法 1.列表中出现CheckBox列 非常简单,在绑定的List实体中,增加一 ...
- [转] 基于C#的波形显示控件的实现
转自 基于C#的波形显示控件的实现[附完整源码下载] 编者记: 09年暑假正好在学院实验室呆了一段时间,做了个完整的上位机软件(具体实现:根据下位机的指令,实现通过串口来操纵下位机进行实验,并将采集的 ...
- AngularJS1.6版本中ui-router路由中/#!/的解决方法 - zhuan
本地编译出的文件可以正常运行,但是服务器编译后到了测试那里路由上就莫名的出现了/#!/,这导致了很多问题. 后来查了下是服务器编译器把AngularJS升级到了1.6版本,而我本地的依旧是1.5. 但 ...
- python:随机数 random
#随机数 import random print(random.randint(10,12))#生成10-12之间的整数 print(random.uniform(10,12))#生成10-12之间的 ...
- js生成元素的事件不执行问题
要求:双击span标签,可以修改.<div class="commands_ticketmiddl_ine_new" > <span>NO:</spa ...
- ssm框架整合之Spring4+SpringMVC+Mybaties3之配置文件如何配置及内容解释--可直接拷贝使用--不定时更改之2017/4/29
经测试,需注意以下几点: 1,controller的自动扫描不能放在applicationContext.xml中,要放在spring-mvc.xml中.同样是<context:componen ...
- 【原】Coursera—Andrew Ng机器学习—Week 11 习题—Photo OCR
[1]机器学习管道 [2]滑动窗口 Answer:C ((200-20)/4)2 = 2025 [3]人工数据 [4]标记数据 Answer:B (10000-1000)*10 /(8*60*60) ...
- 前端生成二维码 - Javascript生成二维码(QR)
前段时间项目中需要动态的生成二维码,经过评估,前后端生成都可以.但后端生成会有两个问题: 没有找到正规发布出来的后端开源库. 二维码图片,会随着商品的增加而不断变多. 基于以上两个问题,决定在前端生成 ...
- Stars URAL - 1028
就是给你一些星星的坐标,然后求出每个星星的左下角有多少颗星星 题目保证按照Y坐标的顺序给出每个星星的坐标,那么我们就可以说,当输入某个星星的坐标时,此时有多少个星星的横坐标小于它,它左下角就有多少星星 ...