科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件.NET 框架中的安全性概述基于角色的安全性

.NET 框架中的安全性概述基于角色的安全性

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

.NET 框架中的安全性概述基于角色的安全性

作者:Demien Watkins 2007年10月26日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

迄今为止介绍的代码访问安全系统,基本上是以代码标识为中心的,而不是以用户或角色为中心的。然而仍需要根据用户标识来表达安全设置。因此,运行库安全系统也附带了基于角色的安全性特性。

基于角色的安全性利用了用户和角色的概念,这与目前许多操作系统中的安全实现相类似。基于角色的安全性中的两个核心抽象是 Identity 和 Principal。Identity 是代码执行时所代表的用户。请谨记,它们可能是应用程序或开发人员定义的逻辑用户,而不一定是操作系统可以看到的用户。Principal 代表用户和用户所属角色的抽象。代表用户标识的类实现 Identity 接口。在 .Net 框架中,提供此接口的默认实现的一般类是 GenericIdentity。代表 Principal 的类实现 IPrincipal 接口。在 .Net 框架中,提供此接口的默认实现的一般类是 GenericPrincipal。

在运行时,每个线程都有且只有一个当前的 Principal 对象与之相关联。当然,代码可以根据安全要求来访问和更改这个对象。每个 Principal 都有且只有一个 Identity 对象。从逻辑上讲,对象的运行库结构与下面的内容类似:

netframesecover_4

4. 基于角色的安全性结构

下面的程序说明了开发人员可以如何使用这些一般类。在本例中,开发人员提供的是安全模型。例如,名称“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领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章