|
八、部署應(yīng)用
VS7將一個project編譯成一個DLL文件,是一個NGWS裝配,一個裝配可以用在一臺機器上,放到 全局Cache,供所有的應(yīng)用訪問,也可以放到某個應(yīng)用的裝配Cache中,只讓一個應(yīng)用訪問。 ASP+允許動態(tài)地引用一個類,只需要提供其裝配和類名,格式: assemlyname#classname
九、安全
1).認(rèn)證和授權(quán) 除了利用Windows提供的認(rèn)證服務(wù)外,ASP+還提供了一種服務(wù),使基于 FORM的認(rèn)證很方便地實現(xiàn)。 它是基于COOKIE工作的,所以客戶瀏覽器必須支持COOKIE。需要注意的是,ASP+的認(rèn)證服務(wù)是從屬于 IIS的認(rèn)證服務(wù)的。 ASP+提供兩種類型的認(rèn)證服務(wù),一是基于文件的ACL的,另一種是基于URL的;赨RL的培植在 配置文件中。 配置<security>節(jié)中的<authentication>元素,可以有下面幾種值: none:沒有認(rèn)證 Windows:NT的用戶/組 Cookie:將未認(rèn)證的用戶轉(zhuǎn)向一個特定的登陸頁面。最常用的一種方法。 Passport:必須安裝PassPort服務(wù)。
例: <configuration> <security> <authentication mode="Cookie"/> </security> </configuration>
2).基于Windows的認(rèn)證 當(dāng)采用它時,一個WindowsPrincipal對象被附加到Request對象中。程序中可以判定當(dāng)前用戶是否 某類角色,如: if(User.IsInrole("Administrators")) ...... 還可以取得用戶名,如: User.Identity.Name; User.Identity.Type;
3).基于FORM的認(rèn)證 a).選cookie模式,禁止匿名訪問: <authentication mode="Cookie"/> <authorization> <deny users="?"/> </authorization> b).配置登陸頁,加密用的鍵,以及Cookie名字,在<authentication>的子元素中: <cookie decryptionkey="autogenerate" loginurl="login.aspx" cookie=".ASPXCOOKIESDEMO"/> 注意,loginurl可以是遠程機器,但decryptionkey則在兩臺機器上的必須相同。descryptionkey 設(shè)成autogenerate則ASP+自動選擇。但如果一臺機器上有多個應(yīng)用,則最好指定。同時,不同的應(yīng)用 也該用不同的Cookie名字。因為同一臺機器上的所有應(yīng)用設(shè)置的Cookie都將被客戶傳回來,所以不能同名。 c).提供登陸頁 d).驗證完后(用你自己的驗證機制,比如同數(shù)據(jù)庫中的記錄做比較),用下面一行: CookieAuthentication.RedirectFromLoginPage(username,persistence) 返回登陸頁前一頁。 這一句也設(shè)定了Cookie,從而讓它之后的ASP+認(rèn)證服務(wù)認(rèn)為用戶已經(jīng)經(jīng)過了認(rèn)證。 如果不想轉(zhuǎn)向原來的頁,而是出現(xiàn)特定的頁,比如登陸用戶可選菜單頁,那必須使用另外的方法, 可以用CookieAuthentication.SetAuthCookie設(shè)置好Cookie,用CookieAutentication.GetAuthCookie 來獲得Cookie. 另外,上面那行中的第二個參數(shù)是一個bool值,表示是否讓Cookie永久保存,如果為false的話, 則當(dāng)用戶關(guān)閉瀏覽器后,cookie就消失了。 用CookieAuthentication.SignOut可以清除Cookie,對應(yīng)用戶退出登陸。 除了以上的用程序自己實現(xiàn)認(rèn)證過程外,也可以用配置文件來實現(xiàn)讓ASP+幫你完成驗證。在 <authentication>節(jié)中: <credentials passwordformat="SHA1"> <user name="white" password="ASPFSSA98527357"> </credentials> 然后程序調(diào)用CookieAuthenticationManager.Authenticate,提供用戶名和口令作為參數(shù),就可以 由ASP+幫你判定用戶是否合法了。 加密算法支持 Clear,SHA1,MD5。
4).認(rèn)證擁護的角色 可以針對用戶,也可以針對角色(組),如: <authorization> <allow users="towhite@263.net"/> <allow roles="Admins"/> <deny users="*"/>
多個用戶名間用逗號","分割。 還可以細化請求方法: <allow verb="post" users="white,saillor"/> 其中,*代表任何人,?代表匿名用戶。
十、國際化,本地化應(yīng)用
ASP+內(nèi)部使用UNICODE,NGWS內(nèi)部基類的String也是用UNICODE。可以支持某種特定的編碼,實現(xiàn)轉(zhuǎn)換。 場所屬性可以通過CultureInfo類訪問,其中,CurrentCulture是同場所有關(guān)的函數(shù)的缺省值, 而CurrentUICulture是場所上的資源數(shù)據(jù)格式,例: <%=CultureInfo.CurrentCulture.NativeName %> <%=CultureInfo.currentUICulture.NativeName %> 一些與場所有關(guān)的類提供格式化輸出,如: <%=DateTime.Now.Format("f",null)%> <%=DateTime.Now.Format("f",new System.Globalization.CultureInfo("de"))%>
可以為某個目錄進行配置,如: <configuration> <globalization fileencoding = "utf-8" requestencoding = "utf-8" responseencoding = "utf-8" culture = "en-us" uiculture = "de" /> 或者在Page指令中: <%@ Page Culture ="fr" UICulture = "fr" ResponseEncoding = "utf-8" %> 在頁面內(nèi)部還可以隨時更改,使用 Thread.CurrentCulture修改,也就是說,同一個頁面可以使用 很多種編碼輸出。
1).設(shè)置文化和編碼 中文的Culture應(yīng)設(shè)為:zh-cn CultureInfo.CurrentCulture.Name = "zh-cn"; CultureInfo.CurrentCulture.EnglishName = "Chinese(Peoples' Republic of China"; CultureInfo.CurrentCulture.NativeName = "中文(簡體)(中華人民共和國)"; 另外,類RegionInfo還提供地域信息: RegionInfo.CurrentRegion.NativeName = "中華人民共和國"; RegionInfo.CurrentRegion.CurrencySymbol = "¥";
2).本地化ASP+應(yīng)用 3).使用資源文件 NGWS基類支持,運行時有個類叫ResourceManager的實例可以使用?梢杂肦esourceWriter或者實用 工具resgen.exe來生成資源文件,resgen以 key = value 的形式作為輸入,如: ; ;注釋 ; [Strings] greetings = 歡迎你! more = 更多新聞
資源文件的后綴為.resources。
如何在頁面中使用資源文件? 用戶的Content-Language可以用Request.UserLanguages[0]來取得。 如何實現(xiàn)多語言支持? a).準(zhǔn)備資源文件,生成.resources文件,文件取名規(guī)則:中間帶Culture名。例:articles.en-us.resources b).global.asax中取得一個ResourceManager,并放如Application中供整個Application使用 c).global.asax中為Application_BeginRequest事件寫代碼,根據(jù)客戶的情況決定當(dāng)前的Culture. d).在頁面中用ResourceManager.GetString取得內(nèi)容。
例: //global.asax中: void Application_OnStart(){ Application["RM"]=new ResourceManager("articles",Server.Mappath("resources") +Enviroment.DirectorySeparatorChar,null); } void Application_BeginRequest(Object sender,EventArgs e){ try { Thread.CurrentThread.CurrentCulture = new CultureInfo(Request.UserLanguages[0]); }catch(ArgumentException){ Thread.CurrentThread.CurrentCulture=new CultureInfo("en-us"); } Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture; }
//default.asax中: ResourceManager rm; void Page_Init(Object sender,EventArgs e){ rm=(ResouceManager)Application["RM"]; }
//輸出內(nèi)容時: <%= rm.GetString("greetings") %>
|