荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: michaelx (扮COOL有害健康), 信区: DotNET
标  题: 通过.NET Framework访问活动目录(2)
发信站: 荔园晨风BBS站 (Sun Oct  6 12:49:37 2002), 站内信件


     这里的第一个构造器是一个基本的缺省构造器,能够在无需任何参数的情况
下创建对象。这意味着该对象将在没有指定的安全权限的情况下连接到本机的
WinNT提供者。

  第二个构造器使我们能够指定连接到给定域的AD上所需要的证书,在需要使用给
定的证书连接到任意域名时,这一构造器非常方便。

  第二个构造器中增添了LoginPath参数,这将使我们能够覆盖LoginPath,能够选
择缺省提供商之外的其他服务提供者。

  下面的代码被我称为“活动方法”,代码如下所示:

  public DSHelper.DSUser LoadUser(string username)



  这一方法用来接收用户名,并在当前的提供者中查找DirectoryEntry。如果没有
找到,就简单地返回NULL。

  public System.Boolean AddUserToGroup(string groupname, DSHelper.DSUser
 dsUser)



  这一方法接收现有组的名字和定制的DSUser类的实例,并试图将用户添加到提供
的组中。这也是第一个我们能看到impersonation的方法()。这一方法的核心是
下面这行代码:

  public System.Collections.ArrayList GetGroups()



  我们将使用该方法获得域中所有组的名单。

  public System.Boolean DeleteUser(DSHelper.DSUser dsUser)



  这一方法获得给定的用户名,并从活动目录中完全删除它。

  public System.DirectoryServices.DirectoryEntry SaveUser(DSHelper.
DSUser dsUser)



  没有实际的在数据库中保存和插入记录的能力,就不能被称为一个完整的DAL。
上面的方法可以完成这二项任务,它首先检查AD,看是否有指定的用户存在。如果
存在,,则会用我们提供的数据更新该用户。如果用户不存在,就会创建一个用户


  public System.Boolean Connect()



  最后,我们需要一个方法,与数据库进行连接,Connect()就是用来完成这一任
务的方法。需要指出的是,此时,它不执行任何假冒的操作或指定使用AD的证书,
我们只在需要的时候才提供证书,这就使得在没有提供安全证书的情况下,DAL只
能在只读的状态下使用。

  下面我们将上面的内容串起来,来看看我们如何使用DAL创建ASP.NET用户管理页



  ASP.NET用户管理页


  在这一例子工程中,我们能够为系统管理员用户输入用户名和口令,它还提供了
一个文本框,我们可以输入域中任何用户的名字,就会列出其所有属性。我们还可
以对用户进行编辑、保存操作,也可以完全删除该用户。

  现在我们来详细地回顾整个工程,其中重点是与DAL进行交互的部份。请读者考
虑使用新的方法改进界面,并实际地创建一个可用性更高以及更友好的设计。另外
,读者也可以考虑如何使用控制台应用程序创建界面。

  扮演

  “扮演”这个词的意思是,我们以其他人或用户的身份执行操作。在我们的
ASP.NET应用程序中,这意味着我们可以暂时地客串其他用户,而不是IIS用来处理
匿名访问的缺省帐户的ASP.NET用户。我们希望能够使自己的代码扮演对AD资源有
更大访问权限的其他用户,以便对资源进行适当的修改。要完成这一过程非常简单


  #region setup impersonation via interop
   //需要保存详细资料时,为完成扮演需要通过InteropServices从COM中导入
   public const int LOGON32_LOGON_INTERACTIVE = 2;
   public const int LOGON32_PROVIDER_DEFAULT = 0;
   System.Security.Principal.WindowsImpersonationContext
impersonationContext;
  [DllImport("advapi32.dll", CharSet=CharSet.Auto)]public static
extern int
  LogonUser(String lpszUserName,
  String lpszDomain,String lpszPassword,int dwLogonType,int
dwLogonProvider,
  ref IntPtr phToken);
  [DllImport("advapi32.dll", CharSet=System.Runtime.InteropServices.
CharSet.Auto,
  SetLastError=true)]public
  extern static int DuplicateToken(IntPtr hToken, int
impersonationLevel,
  ref IntPtr hNewToken);
   #endregion




  图1.5 建立扮演


  首先,我们需要从advapi32.dll中导入新的方法,其中包括一些有用的常量。名
字为impersonationContext的变量将用来保持扮演操作之前的Windows用户。

  这样,我们就建立了扮演,下面是一个如何使用它的例子:

  if(impersonateValidUser(this.LoginUsername, this.DomainName,
  this.loginPassword)) {
   //在这里插入在指定用户的安全环境下运行的代码
   //不要忘记取消扮演
   undoImpersonation();
  } else {
   //扮演操作失败了,插入保证失败后系统安全的机制
  }




  图1.6 扮演的使用


  我们只需要简单地以有效的用户名和口令调用impersonateValidUser方法,来扮
演该用户。从现在开始,只到调用undoImpersonation()之后,我们将以给定的用
户名执行所有的操作。

  为了使ASP.NET下的扮演操作能够正常地工作,我们应当改变machine.config(
c:\winnt\microsoft.net\framework\v%VERSION%\config\machine.config)中的
processModel节点,其中的username属性必须被设置成System。


  结束语


  本篇文章所论述的是使用System.DirectoryServices名字空间完成一个能够完全
地运行的、面向任何提供商AD的DAL所必需的基本内容。在实际应用中,可以对该
例子进行改变,使这更符合我们的要求。需要记住的是,对于任何能够实际使用的
DAL,它不应当只局限于包括正常的数据库提供者在内的一种服务提供者。我们应
当能够交换DAL。

  看过本篇文章后,读者可能感到有一种意犹未尽的感觉。读者可能希望在其中添
加组管理的功能,其中包括组的创建、编辑和删除,并显示每个用户所属的组以及
每个组中的用户。不过这些都需要通过COM Interop才能完成,请读者自行参阅有
关资料。


--

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 61.144.235.39]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店