.NET框架中基于角色的安全性(2)
Principal对象
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.\n");
}
Console.WriteLine(
strUserName + " is PERMITTED to proceed.\n");
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 .NET\Vc7\PlatformSDK\Include文件夹中找到该文件。
public virtual bool IsInRole(string);
第2个重载函数接受一个字符串参数,该参数表示一个用户组名称,比如MYCOMPUTER\Developer(MachineName\GroupName)表示了机器名为MYCOMPUTER的计算机上的Developer用户组。不过对于系统内置的用户组就不能这样表示了,比如Administrators,不能表示为MYCOMPUTER\Administrators,而应该像BUILTIN\Administrators这样,不过这样总觉得有点多余,不够自然。于是我们可以使用下面的重载函数。
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- 用户不能执行危害系统或者影响整个系统的操作。