.NET框架中基于角色的安全性(2)
2024-07-10 13:07:32
供稿:網(wǎng)友
 
principal對(duì)象 
   
    principal對(duì)象是實(shí)現(xiàn)了iprincipal接口的類的實(shí)例,這些對(duì)象用來表示用戶,并且包括了用戶的身份信息。system.security.principal命名空間包括了幾種類型的principal類,這些類中封裝了程序代碼運(yùn)行的的安全環(huán)境(security context)。我們?cè)诤竺鎸?huì)看到對(duì)用戶名和角色進(jìn)行檢查以確定根據(jù)用戶身份和角色資格是否可以讓用戶執(zhí)行某些特定操作的示例代碼。 
   
    對(duì)于每一個(gè)線程來說都與一個(gè)principal對(duì)象相關(guān)聯(lián)。這個(gè)principal對(duì)象包括了表示運(yùn)行當(dāng)前線程的用戶的identity對(duì)象。我們可以利用thread類的靜態(tài)屬性currentprincipal來獲得這個(gè)principal對(duì)象。 
   
    下面我們來看看iprincipal接口,該接口只有一個(gè)identity公共屬性和isinrole公共方法: 
   
    1、identity屬性指向一個(gè)與principal 對(duì)象關(guān)聯(lián)的iidentity對(duì)象。 
   
    2、isinrole方法需要一個(gè)字符串參數(shù),該字符串是一個(gè)角色的名稱,并且返回布爾值,指出principal對(duì)象是否屬于指定的角色。 
   
    由于實(shí)際開發(fā)的需要,我們更多接觸到的是windowsprincipal類,下面將詳細(xì)討論windowsprincipal類,相對(duì)而言,genericprincipal類就要簡(jiǎn)略一些了。 
   
    genericprincipal類 
   
    genericprincipal類用來表示一個(gè)通過自定義驗(yàn)證的用戶,通常與genericidentity類一起使用。下面是一段簡(jiǎn)單的程序,說明了這兩個(gè)類如何使用: 
   
   
  //創(chuàng)建一個(gè)genericidentity對(duì)象 
  iidentity mygenericidentity = new genericidentity(strusername, "myauthenticationtype"); 
   
  //創(chuàng)建一個(gè)genericprincipal對(duì)象 
  string[] roles = null; 
  genericprincipal mygenericprincipal = new genericprincipal(mygenericidentity, roles); 
   
  //將創(chuàng)建的genericprincipal對(duì)象附加到當(dāng)前線程上 
  thread.currentprincipal = mygenericprincipal; 
   
    注意在上面的例子中,我們可以把myauthenticationtype的驗(yàn)證類型換成熟知的kerberos身份驗(yàn)證或者ntlm身份驗(yàn)證。 
   
    下面是驗(yàn)證的過程: 
   
   
  //取得當(dāng)前線程的principal對(duì)象 
  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類作為我們?cè)陂_發(fā)中最常遇到的實(shí)現(xiàn)了iprincipal接口的類,構(gòu)造函數(shù)相當(dāng)簡(jiǎn)單: 
  public windowsprincipal(windowsidentity ntidentity); 
   
    下面的代碼說明了如何創(chuàng)建一個(gè)windowsprincipal對(duì)象: 
   
   
  windowsidentity wi = windowsidentity.getcurrent(); 
  windowsprincipal wp = new windowsprincipal(wi); 
   
    windowsprincipal類中需要注意的是下面這三個(gè)重載的isinrole方法: 
   
   
  public virtual bool isinrole(int); 
   
    第1個(gè)重載函數(shù)接受一個(gè)整型參數(shù),該參數(shù)表示用戶組對(duì)應(yīng)的rid(rid也就是與域相關(guān)聯(lián)的下級(jí)憑證(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個(gè)重載函數(shù)接受一個(gè)字符串參數(shù),該參數(shù)表示一個(gè)用戶組名稱,比如mycomputer/developer(machinename/groupname)表示了機(jī)器名為mycomputer的計(jì)算機(jī)上的developer用戶組。不過對(duì)于系統(tǒng)內(nèi)置的用戶組就不能這樣表示了,比如administrators,不能表示為mycomputer/administrators,而應(yīng)該像builtin/administrators這樣,不過這樣總覺得有點(diǎn)多余,不夠自然。于是我們可以使用下面的重載函數(shù)。 
  public virtual bool isinrole(windowsbuiltinrole); 
   
    第3個(gè)重載函數(shù)接受一個(gè)windowsbuiltinrole枚舉類型參數(shù),下面就是windowsbuiltinrole枚舉中定義的值: 
   
    1、accountoperator- 管理計(jì)算機(jī)上或域中的用戶帳號(hào)。 
   
    2、administrator- 可以任意訪問計(jì)算機(jī)或域 
   
    3、backupoperator- 可以在文件系統(tǒng)上執(zhí)行備份和恢復(fù)操作。 
   
    4、guest- 和user類似,不過有更多的限制。 
   
    5、poweruser- 和administrator地位相近,不過有一些限制。 
   
    6、printoperator- 執(zhí)行打印操作。 
   
    7、replicator- 在域中執(zhí)行文件復(fù)制。 
   
    8、systemoperator- 管理計(jì)算機(jī)。 
   
    9、user- 用戶不能執(zhí)行危害系統(tǒng)或者影響整個(gè)系統(tǒng)的操作。中國(guó)最大的web開發(fā)資源網(wǎng)站及技術(shù)社區(qū),