.NET框架中基于角色的安全性(2)
点击次数:14 次 发布日期:2008-11-27 00:01:52 作者:源代码网
|
源代码网推荐 源代码网推荐 Principal对象是实现了IPrincipal接口的类的实例,这些对象用来表示用户,并且包括了用户的身份信息。System.Security.Principal命名空间包括了几种类型的Principal类,这些类中封装了程序代码运行的的安全环境(security context)。我们在后面将会看到对用户名和角色进行检查以确定根据用户身份和角色资格是否可以让用户执行某些特定操作的示例代码。 源代码网推荐 源代码网推荐 对于每一个线程来说都与一个principal对象相关联。这个principal对象包括了表示运行当前线程的用户的identity对象。我们可以利用Thread类的静态属性CurrentPrincipal来获得这个principal对象。 源代码网推荐 源代码网推荐 下面我们来看看IPrincipal接口,该接口只有一个Identity公共属性和IsInRole公共方法: 源代码网推荐 源代码网推荐 1、Identity属性指向一个与principal 对象关联的IIdentity对象。 源代码网推荐 源代码网推荐 2、IsInRole方法需要一个字符串参数,该字符串是一个角色的名称,并且返回布尔值,指出principal对象是否属于指定的角色。 源代码网推荐 源代码网推荐 由于实际开发的需要,我们更多接触到的是WindowsPrincipal类,下面将详细讨论WindowsPrincipal类,相对而言,GenericPrincipal类就要简略一些了。 源代码网推荐 源代码网推荐 GenericPrincipal类 源代码网推荐 源代码网推荐 GenericPrincipal类用来表示一个通过自定义验证的用户,通常与GenericIdentity类一起使用。下面是一段简单的程序,说明了这两个类如何使用: 源代码网推荐 源代码网推荐 源代码网推荐 //创建一个GenericIdentity对象 源代码网推荐 IIdentity myGenericIdentity = new GenericIdentity(strUserName, "MyAuthenticationType"); 源代码网推荐 源代码网推荐 //创建一个GenericPrincipal对象 源代码网推荐 String[] roles = null; 源代码网推荐 GenericPrincipal myGenericPrincipal = new GenericPrincipal(myGenericIdentity, roles); 源代码网推荐 源代码网推荐 //将创建的GenericPrincipal对象附加到当前线程上 源代码网推荐 Thread.CurrentPrincipal = myGenericPrincipal; 源代码网推荐 源代码网推荐 注意在上面的例子中,我们可以把MyAuthenticationType的验证类型换成熟知的Kerberos身份验证或者NTLM身份验证。 源代码网推荐 源代码网推荐 下面是验证的过程: 源代码网推荐 源代码网推荐 源代码网推荐 //取得当前线程的principal对象 源代码网推荐 IPrincipal principal = Thread.CurrentPrincipal; 源代码网推荐 源代码网推荐 if (!principal.Identity.Name.Equals("TrustedUser")) 源代码网推荐 { 源代码网推荐 throw new SecurityException( 源代码网推荐 strUserName + " NOT PERMITTED to proceed. "); 源代码网推荐 } 源代码网推荐 Console.WriteLine( 源代码网推荐 strUserName + " is PERMITTED to proceed. "); 源代码网推荐 源代码网推荐 WindowsPrincipal类 源代码网推荐 源代码网推荐 WindowsPrincipal类作为我们在开发中最常遇到的实现了IPrincipal接口的类,构造函数相当简单: 源代码网推荐 public WindowsPrincipal(WindowsIdentity ntIdentity); 源代码网推荐 源代码网推荐 下面的代码说明了如何创建一个WindowsPrincipal对象: 源代码网推荐 源代码网推荐 源代码网推荐 WindowsIdentity wi = WindowsIdentity.GetCurrent(); 源代码网推荐 WindowsPrincipal wp = new WindowsPrincipal(wi); 源代码网推荐 源代码网推荐 WindowsPrincipal类中需要注意的是下面这三个重载的IsInRole方法: 源代码网推荐 源代码网推荐 源代码网推荐 public virtual bool IsInRole(int); 源代码网推荐 源代码网推荐 第1个重载函数接受一个整型参数,该参数表示用户组对应的RID(RID也就是与域相关联的下级凭证(domain-relative subauthority)ID)。RID值定义在Platform SDK的头文件Winnt.h中,Winnt.h中包括一些常见的用户和组,比如DOMAIN_USER_RID_ADMIN、 DOMAIN_USER_RID_GUEST、DOMAIN_GROUP_RID_ADMINS、DOMAIN_GROUP_RID_USERS和DOMAIN_GROUP_RID_GUESTS等等,可以在...Microsoft Visual Studio .NETVc7PlatformSDKInclude文件夹中找到该文件。 源代码网推荐 源代码网推荐 源代码网推荐 public virtual bool IsInRole(string); 源代码网推荐 源代码网推荐 第2个重载函数接受一个字符串参数,该参数表示一个用户组名称,比如MYCOMPUTERDeveloper(MachineNameGroupName)表示了机器名为MYCOMPUTER的计算机上的Developer用户组。不过对于系统内置的用户组就不能这样表示了,比如Administrators,不能表示为MYCOMPUTERAdministrators,而应该像BUILTINAdministrators这样,不过这样总觉得有点多余,不够自然。于是我们可以使用下面的重载函数。 源代码网推荐 public virtual bool IsInRole(WindowsBuiltInRole); 源代码网推荐 源代码网推荐 第3个重载函数接受一个WindowsBuiltInRole枚举类型参数,下面就是WindowsBuiltInRole枚举中定义的值: 源代码网推荐 源代码网推荐 1、AccountOperator- 管理计算机上或域中的用户帐号。 源代码网推荐 源代码网推荐 2、Administrator- 可以任意访问计算机或域 源代码网推荐 源代码网推荐 3、BackupOperator- 可以在文件系统上执行备份和恢复操作。 源代码网推荐 源代码网推荐 4、Guest- 和User类似,不过有更多的限制。 源代码网推荐 源代码网推荐 5、PowerUser- 和Administrator地位相近,不过有一些限制。 源代码网推荐 源代码网推荐 6、PrintOperator- 执行打印操作。 源代码网推荐 源代码网推荐 7、Replicator- 在域中执行文件复制。 源代码网推荐 源代码网推荐 8、SystemOperator- 管理计算机。 源代码网推荐 源代码网推荐 9、User- 用户不能执行危害系统或者影响整个系统的操作。 源代码网供稿. |
