建议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:为应用程序设定运行权限的更多相关文章

  1. 博友的 编写高质量代码 改善java程序的151个建议

    编写高质量代码 改善java程序的151个建议 http://www.cnblogs.com/selene/category/876189.html

  2. 编写高质量代码--改善python程序的建议(六)

    原文发表在我的博客主页,转载请注明出处! 建议二十八:区别对待可变对象和不可变对象 python中一切皆对象,每一个对象都有一个唯一的标识符(id()).类型(type())以及值,对象根据其值能否修 ...

  3. 编写高质量代码--改善python程序的建议(八)

    原文发表在我的博客主页,转载请注明出处! 建议四十一:一般情况下使用ElementTree解析XML python中解析XML文件最广为人知的两个模块是xml.dom.minidom和xml.sax, ...

  4. 编写高质量代码改善java程序的151个建议——导航开篇

    2014-05-16 09:08 by Jeff Li 前言 系列文章:[传送门] 下个星期度过这几天的奋战,会抓紧java的进阶学习.听过一句话,大哥说过,你一个月前的代码去看下,慘不忍睹是吧.确实 ...

  5. 编写高质量代码改善python程序91个建议学习01

    编写高质量代码改善python程序91个建议学习 第一章 建议1:理解pythonic的相关概念 狭隘的理解:它是高级动态的脚本编程语言,拥有很多强大的库,是解释从上往下执行的 特点: 美胜丑,显胜隐 ...

  6. 编写高质量代码改善C#程序的157个建议[1-3]

    原文:编写高质量代码改善C#程序的157个建议[1-3] 前言 本文主要来学习记录前三个建议. 建议1.正确操作字符串 建议2.使用默认转型方法 建议3.区别对待强制转换与as和is 其中有很多需要理 ...

  7. 编写高质量代码改善程序的157个建议:第87个建议之区分WPF和WinForm的线程模型

    今天有时间了,继续<编写高质量代码改善程序的157个建议>的阅读,当我阅读到建议87的时候,里面的一些代码示例和文中所说的不一致了,是不是我现在用的是NetFramework 4.0的缘故 ...

  8. 编写高质量代码改善java程序的151个建议——[1-3]基础?亦是基础

    原创地址:   http://www.cnblogs.com/Alandre/  (泥沙砖瓦浆木匠),需要转载的,保留下! Thanks The reasonable man adapts himse ...

  9. 编写高质量代码:改善Java程序的151个建议 --[117~128]

    编写高质量代码:改善Java程序的151个建议 --[117~128] Thread 不推荐覆写start方法 先看下Thread源码: public synchronized void start( ...

  10. 编写高质量代码:改善Java程序的151个建议 --[106~117]

    编写高质量代码:改善Java程序的151个建议 --[106~117] 动态代理可以使代理模式更加灵活 interface Subject { // 定义一个方法 public void reques ...

随机推荐

  1. gil基本介绍

    一 引子 定义: In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native t ...

  2. 【Oracle】Oracle改变日志归档模式

    一.确认工作模式:   1.查询V$DATABASE      SQL>select log_mode from v$database;      归档日志:ARCHIVELOG     2.执 ...

  3. TreeGrid

    TreeGrid是树形表格,为了展示成树形,比数据表格主要增加了以下两点: 1.表格属性中设置 idField.treeField 两个属性:idField 表示用于区分上下级的主键,treeFiel ...

  4. C#并口操作

    using System;using System.Runtime.InteropServices;public class PortAccess { [DllImport("inpout3 ...

  5. Innobackupex MySQL 全备、增备及恢复

    简介: 在这之前都是通过 mysqldump 来备份数据库的,由于是逻辑备份,所以采用这种备份方式数据是很安全的,跨平台.版本都很容易. 凡事有利必有弊,逻辑备份在你数据库比较大时,备份.恢复数据所耗 ...

  6. spring data jpa删除的使用方式

    public interface UserRepository extends CrudRepository<User, Long> { Long deleteByLastname(Str ...

  7. Linux实战教学笔记34:企业级监控Nagios实践(上)

    一,Nagios监控简介 生活中大家应该对监控已司空见惯了,例如:餐馆门前的监控探头,小区里的视频监控,城市道路告诉监控探头等,这些监控的目的大家都很清楚,无须多说.那么,企业工作中为什么要部署监控系 ...

  8. 排序总结---常用的排序算法总结,java和js实现

    这篇博客对几种常见的排序算法进行归纳总结,在接下来的博客中会依次给出每个排序算法的例子 [由于博客上面进行编辑不太方便,图表都是在电脑上编辑好,上传的图片] 1.排序的分类 2.几种内部排序方法的比较 ...

  9. 二维码生成插件qrious及网站扫码登录的一些理解

    什么是二维码 ​ 二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型. ...

  10. unity3d 事件说明

    Unity3D中所有控制脚本的基类MonoBehaviour有一些虚函数用于绘制中事件的回调,也可以直接理解为事件函数,例如大家都很清楚的Start,Update等函数,以下做个总结.   Awake ...