扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:Demien Watkins 2007年10月26日
关键字:
迄今为止介绍的代码访问安全系统,基本上是以代码标识为中心的,而不是以用户或角色为中心的。然而仍需要根据用户标识来表达安全设置。因此,运行库安全系统也附带了基于角色的安全性特性。
基于角色的安全性利用了用户和角色的概念,这与目前许多操作系统中的安全实现相类似。基于角色的安全性中的两个核心抽象是 Identity 和 Principal。Identity 是代码执行时所代表的用户。请谨记,它们可能是应用程序或开发人员定义的逻辑用户,而不一定是操作系统可以看到的用户。Principal 代表用户和用户所属角色的抽象。代表用户标识的类实现 Identity 接口。在 .Net 框架中,提供此接口的默认实现的一般类是 GenericIdentity。代表 Principal 的类实现 IPrincipal 接口。在 .Net 框架中,提供此接口的默认实现的一般类是 GenericPrincipal。
在运行时,每个线程都有且只有一个当前的 Principal 对象与之相关联。当然,代码可以根据安全要求来访问和更改这个对象。每个 Principal 都有且只有一个 Identity 对象。从逻辑上讲,对象的运行库结构与下面的内容类似:
下面的程序说明了开发人员可以如何使用这些一般类。在本例中,开发人员提供的是安全模型。例如,名称“Damien”以及角色“Lecturer”和“Examiner”与操作系统可以支持的任何用户和角色都无关。
using System; using System.Threading; using System.Security; using System.Security.Principal; namespace RoleBasedSecurity { class Sample { static void Main(string[] args) { String [] roles = {"Lecturer", "Examiner"}; GenericIdentity i = new GenericIdentity("Damien"); GenericPrincipal g = new GenericPrincipal(i, roles); Thread.CurrentPrincipal = g; if(Thread.CurrentPrincipal.Identity.Name == "Damien") Console.WriteLine("Hello Damien"); if(Thread.CurrentPrincipal.IsInRole("Examiner")) Console.WriteLine("Hello Examiner"); if(Thread.CurrentPrincipal.IsInRole("Employee")) Console.WriteLine("Hello Employee"); } } }
该程序产生了下面的输出:
Hello Damien Hello Examiner
根据开发人员的需要,还可以使用 Microsoft(R) Windows(R) 安全模型。在这种情况下,用户和角色会与宿主计算机中的用户和角色紧密相连,因此可能需要在宿主系统上创建这些帐户。下面的示例使用的是本地计算机上的用户帐户。本例中也使用了一些 syntactic sugar(语法糖块);.NET 框架中的 PrincipalPermissionAttribute 类就有效地封装了对一些方法(如 IsInRole)的调用,以便开发人员可以使用简化的语法。
namespace RoleBased { class Sample { [PrincipalPermissionAttribute(SecurityAction.Demand, Name=@"culex\damien")] public static void UserDemandDamien() { Console.WriteLine("Hello Damien!"); } [PrincipalPermissionAttribute(SecurityAction.Demand, Name=@"culex\dean")] public static void UserDemandDean() { Console.WriteLine("Hello Dean!"); } static void Main(string[] args) { AppDomain.CurrentDomain.SetPrincipalPolicy( PrincipalPolicy.WindowsPrincipal); try { UserDemandDamien(); UserDemandDean(); } catch(Exception) { Console.WriteLine("Exception thrown"); } } } }
PrincipalPermissionAtribute 可确保每次调用 UserDemandDamien 和 UserDemandDean 方法时都进行运行库检查。当然,程序可能由 Dean、Damien 或其他人执行,因此对这两个方法调用的安全检查即使未全部失败,也至少有一个会失败。Main 的第一行将用户策略设置为 Windows(执行本例的操作系统)的用户策略。当用户“culex\damien”执行程序时将产生如下输出:
Hello Damien! Exception thrown查看本文来源
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者