国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

關于IBuySpy里面用戶權限驗證方面的東西

2024-07-21 02:15:47
字體:
來源:轉載
供稿:網友
asp.net在頁面的context.user里面放了一個實現iprincipal的對象,用來實現對已驗證用戶的管理。asp.net系統中,通常采用的方式就是擴展這個context.user,讓它里面保存定制的信息。
  
  
  
  1、擴展方式
  
  擴展方式基本上有兩種:直接利用genericprincipal和自己寫一個實現iprincipal的類。ibuyspy用的前者,優點就是n簡單。
  
  
  
  context.user = new genericprincipal(context.user.identity, roles);
  
  
  
  roles是一個保存了當前用戶的角色信息的string,各個角色間用“;”分隔,由前面的代碼調用數據層中的userdb.getroles()方法來得到。
  
  
  
  自己寫一個實現iprincipal的類其實也是n簡單,你只需要實現兩個接口:identity屬性返回一個iidentity的用戶標識對象,isinrole(string role)判斷用戶是否具有參數中的角色。下面是我寫的一個替代ibuyspy中原有擴展模式的類:
  
  
  
  
  
  public class ibsprincipal : iprincipal {
  
  
  
  private iidentity _identity;
  
  private string[] _asrole;
  
  
  
  下面是兩個構造函數:
  
  
  
  public ibsprincipal(iidentity identity, string roles) {
  
  _identity = identity;
  
  _asrole = roles.split(';');
  
  }
  
  
  
  public ibsprincipal(iidentity identity, string[] roles) {
  
  _identity = identity;
  
  _asrole = roles;
  
  }
  
  
  
  然后是用來實現iprincipal的一個屬性和一個方法:
  
  
  
  public iidentity identity {
  
  get {
  
  return _identity;
  
  }
  
  }
  
  
  
  public bool isinrole(string role) {
  
   // 下面一行幸得“jgtm'2003”告知array有一個static的indexof()
  
   // 原來是用循環查詢_asrole....土不可及...
  
   return (system.array.indexof(_asrole, role) > -1);
  
  }
  
  
  
  ok,然后我們就可以用下面這句替代上面ibuyspy原有的那句了:
  
  
  
  context.user = new ibsprincipal(context.user.identity, roles);
  
  
  
  看起來好像自己創建這個ibsprincipal并不劃算,它沒有提供比genericprincipal更多的功能,但好處是我們以后可以隨時擴展它,而且實現的成本也很低。
  
  
  
  2、時機
  
  我們在什么時候進行上面所說的這樣的擴展行為呢?
  
  
  
  ibuyspy選擇在global.asax里面的application_authenticaterequest事件里面進行這些動作,只要asp.net程序需要進行用戶驗證,那么肯定要經過這里,這個地方不錯。
  
  
  
  另一個好地方就是在“頁面基類”的page_init方法中,我們在構造網站的時候就可以先構建一個“頁面基類”(即使一開始里面什么都沒有),所有的頁面都從這個基類繼承下來而不是從默認的system.web.ui.page,這樣做的好處是我們可以隨時把類似的動作放在基類中。可惜ibuyspy本身并沒有應用這種“頁面基類”的方式。
  
  
  
  3、formsauthenticationticket
  
  這個類是一個“驗證票據”類,我們可以利用這個票據來保存用戶的信息,并把這個票據寫到客戶端的cookie里面,以后客戶再來時,從cookie中把這個票據取回來,就可以得到用戶的信息了。
  
  
  
  上面這一段說的就是ibuyspy做的,但是一定要注意,我們自己做這些操作,和asp.net內置的forms驗證沒有任何關系,雖然它也是通過類似的保存票據到cookie來實現的。
  
  
  
  用這個票據來寫到cookie與我們自定義一個cookie去寫相比有什么好處呢,首先可以設定票據的過期時間、決定是否永久在cookie保存票據、票據中可以寫入自定義的信息(比如用戶所具有的角色),而且,.net內置的formsauthentication.encrypt()方法和formsauthentication.decrypt()方法可以把一個票據加密成一個字符串,和從一個字符串解密出一個票據,這樣省掉了我們很多的工作了。
  
  
  
  來看看ibuyspy里面的代碼,創建一個票據并寫到cookie:
  
  
  
  formsauthenticationticket ticket = new formsauthenticationticket(
  
  1, // version
  
  context.user.identity.name, // user name
  
  datetime.now, // issue time
  
  datetime.now.addhours(1), // expires every hour
  
  false, // don't persist cookie
  
  rolestr // roles
  
  );
  
  
  
  // encrypt the ticket
  
  string cookiestr = formsauthentication.encrypt(ticket);
  
  
  
  // send the cookie to the client
  
  response.cookies["portalroles"].value = cookiestr;
  
  response.cookies["portalroles"].path = "/";
  
  response.cookies["portalroles"].expires = datetime.now.addminutes(1);
  
  
  
  從cookie中讀出票據,再從票據中得到用戶具有的角色:
  
  
  
  // get roles from roles cookie
  
  formsauthenticationticket ticket = formsauthentication.decrypt(context.request.cookies["portalroles"].value);
  
  
  
  //convert the string representation of the role data into a string array
  
  arraylist userroles = new arraylist();
  
  
  
  foreach (string role in ticket.userdata.split( new char[] {';'} )) {
  
  userroles.add(role);
  
  }
  
  
  
  roles = (string[]) userroles.toarray(typeof(string)); 
  

最大的網站源碼資源下載站,

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 临沂市| 长乐市| 麻栗坡县| 交口县| 台中市| 浏阳市| 赤壁市| 凤翔县| 商城县| 塔河县| 沙河市| 阿勒泰市| 郁南县| 安达市| 兴义市| 湖南省| 永年县| 民权县| 平果县| 饶平县| 乌鲁木齐县| 鄯善县| 大新县| 尼木县| 棋牌| 扎兰屯市| 平阴县| 岱山县| 西丰县| 客服| 东阿县| 哈尔滨市| 丹东市| 哈巴河县| 六盘水市| 大荔县| 介休市| 中牟县| 韶关市| 通化市| 鄂尔多斯市|