.NET的安全模型在系统的安全模型的上层,并且与一些服务器程序的安全特性结合的很好(当然,目前这些产品还仅限于微软自己的产品,比如SQL Server和Internet Information Services (IIS))。正因为.NET与操作系统的层次不同,所以.NET程序的安全性就取决于这样几个因素:.NET安全性是如何配置的,程序组件是怎样编写的,以及一些由Windows,网络设置或者其他程序设定的安全特性。
GenericIdentity类除了三个IIdentity接口定义的属性之外没有更多的东西了。不过,GenericIdentity类提供了两个构造函数。一个构造函数接受一个字符串参数,该参数指定的是用户名;另一个构造函数接受两个参数:第一个是用户名字符串,第二个是给定的验证类型字符串。 public GenericIdentity(string name); public GenericIdentity(string name, string type); 现在我们不过多地讲述使用GenericIdentity类的细节问题,在后面我们将会看到在一个实际的程序当中是如何使用GenericIdentity对象的。
GetAnonymous和GetCurrent方法都返回一个WindowsIdentity对象,使用也很简单,我们需要注重的是Impersonate方法,该方法有两个版本:实例版本(instance version)和静态版本(static version)。实例版本的方法不带参数,返回一个基于被调用WindowsIdentity对象的WindowsImpersonationContext对象(WindowsImpersonationContext类表示模拟操作之前的 Windows 用户);静态版本则需要一个IntPtr参数。这种模拟操作对于服务器程序来说是很有用的,它可以降低客户端访问服务器所用用户帐号的权限,从而在一定程度上提高了安全性。下面是上述方法的具体语法: public static WindowsIdentity GetAnonymous(); public static WindowsIdentity GetCurrent(); public virtual WindowsImpersonationContext Impersonate(); public static WindowsImpersonationContext Impersonate(IntPtr userToken); Principal对象
下面是验证的过程: //取得当前线程的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);