理解并使用ASP.NET的高级配置
?
引言: 本文將討論ASP.NET應用的高級配置方法,在文中將討論的一些配置如下:為ASP.NET進程設置獨立的ID標記;配置ASP.NET網站或者網
?
ASP.NET配置
我們都知道,使用ASP是不需要也沒有地方可以配置的(IIS配置除外),因此,我們不能針對一些特定的網站應用或者特定的網站目錄,設置一些特殊配置,可以這樣說,ASP的應用,是比較“傻瓜化”的,網站設計者對網站,只能通過程序而不能通過系統配置來實現對網站的有效管理。和ASP不一樣,ASP.NET通過XML格式的文件Machine.Config和Web.Config來完成對網站和網站目錄的配置。對于一個網站整體而言,整個服務器的配置信息保存在Machine.Config文件中,該文件的具體位置在%system32%\Microsoft.NET\Framework\[版本號]\Config目錄,它包含了運行一個ASP.NET服務器需要的所有配置信息。當你建立一個新的WEB Project的時候,VS.NET 會自動建立一個WEB.Config文件,WEB.Config包含了各種專門針對一個具體應用的一些特殊的配置,比如Session的管理、錯誤捕捉等配置。一個WEB.Config可以從Machine.Config繼承和重寫部分備置信息。因此,對于ASP.NET而言,針對一個具體的ASP.NET應用或者一個具體的網站目錄,是有兩部分設置可以配置的,一是針對整個服務器的Machine.Config配置,另外一個是針對該網站或者該目錄的Web.Config配置,一般的,Web.Config存在于獨立網站的根目錄,它對該目錄和目錄下的子目錄起作用。
本文將討論的一些具體配置如下:
-
<authorization>:訪問授權信息的配置;
-
<identity>:改變ASP.NET應用的工作進程,繼承、重寫和拒絕重寫相同配置;
-
<sessionState>:繼承、重寫和拒絕重寫相同配置;
-
<appSettings>:重寫和拒絕重寫相同配置;
例子程序
為了說明以上問題,我們建立了一個ASP.NET例子程序ConfigApplication,以下是這個程序的以下詳細信息:
| Solution | ConfigApplication.sln |
| Project Name | ConfigApplication |
| Language | C# |
| Build | Release |
以下圖片是ConfigApplication的文件結構:
以下是另外一個網站CustomConfig的一些信息:
| Solution | CustomConfig.sln |
| Project Name | CustomConfig |
| File Name | ConfigHandler.cs |
| Language | C# |
| Build | Release |
<authorization>
WEB.Config中的<authorization>標記使用<allow>和<deny>子標記來實現配置訪問控制權限。在這里,需要注意的一點是,這里的訪問控制只對ASP.NET本身的資源有用,比如:ASPX、ASMX、ASCX文件資源,對于非ASP.NET資源,比如ASP、TXT、圖像文件等,都不能提供訪問控制。以下是實現該配置的標記:
<authorization>
<allow users="comma-separated list of users"
roles="comma-separated list of roles"
verbs="comma-separated list of verbs" />
<deny users="comma-separated list of users"
roles="comma-separated list of roles"
verbs="comma-separated list of verbs" />
</authorization>
以上標記中,<Allow>標記定義可以訪問資源的用戶,<Deny>標記定義不許訪問資源的用戶。比如,以下標記就定義用戶“wcb02h26\Niranjan”可以訪問Web.Config文件所在文件夾及其子文件夾的資源,其他所有用戶均不能訪問該文件夾的資源(注意使用了<deny users=”*”>標記)。
<authorization >
<allow users="wcb02h26\Niranjan" />
<deny users="*"/>
</authorization>
以上設置可以在ConfigApplication應用的根目錄下的Web.Config文件找到。在該應用的根目錄下面,有RootFolderForm.aspx文件,如果用戶訪問該文件,ASP.NET將調用Windows的登錄對話框(圖二)
當用戶通過驗證以后,將見到以下頁面(圖三),在這個頁面中,顯示了登錄用戶的信息:
以上的設置可以在該應用的子目錄中實現繼承或者重寫,例子程序中,根目錄包含一個子目錄“Subfolder1”,現在,讓我們來看看怎樣實現用戶“wcb02h26\Niranjan”不能訪問“Subfolder1”,但是;另外一個用戶“wcb02h26\test”卻可以訪問。為了實現重寫配置,我們需要在目錄“Subfolder1”的根目錄添加一個WEB.Config配置文件:
<?xmlversion="1.0"encoding="utf-8"?>
<configuration>
< system.web >
<! -- For authorization code -- >
< authorization >
< allow users ="wcb02h26\test" />
< deny users ="*"/>
</ authorization >
</ system.web >
</configuration>
當我們訪問“Subfolder1”目錄下的“SubFolder1Form.aspx”文件的時候,ASP.NET將調用Windows登錄對話框,并且只許用戶“wcb02h26\test”訪問。然而,特別需要注意的是,以上的配置并不能對圖像文件等非ASP.NET資源起作用,也就是說,我們不能期望非ASP.NET資源也可以受到訪問控制。
除了使用上面提到的“User”標記以外,如果我們需要對一組用戶實現訪問控制,就可以使用“roles”標記,使用“Verbs”標記,我們還可以對訪問類型進行控制。以下的舉例,實現wcb02h26計算機的所有Administrator組用戶自由訪問根目錄下的ASP.NET資源,但是任何人都不能從頁面提交(Post)信息給服務器。
<?xmlversion="1.0"encoding="utf-8"?>
<configuration>
< system.web >
<! -- For authorization code -- >
< authorization >
< allow roles ="wcb02h26\administrators" verbs ="GET"/>
< deny users ="*" verbs ="POST"/>
</ authorization >
</ system.web >
</configuration>
以下是頁面SubFolder2Form.aspx的運行截圖(圖四):
如果用戶點擊“Submit”按鈕提交信息,將出現以下錯誤頁面(圖五):
如果從以上配置信息中去掉“<deny>”標記,用戶就可以隨意提交信息而不會出現錯誤了。
以上我們介紹了對網站資源進行訪問控制的一些配置,特別需要注意的是,和ASP中通過數據庫實現訪問控制一樣,這里的資源訪問控制,也只針對專門的ASP.NET 資源,非ASP.NET 資源,瀏覽者是可以隨意訪問的。
<identity>
這個標記用來控制ASP.NET應用的“身份”,以下是這個標記的具體使用:
<identity impersonate="true|false"
userName="username"
password="password"
/>
<identity>標記決定ASP.NET應用使用哪一個用戶賬號來運行,在Machine.Config中,默認的, impersonate是設置為“False”的。當調用根目錄下的RootFolderForm.aspx文件的時候,會將程序使用的用戶顯示出來(圖六):
以上的設置可以通過修改Machine.Config文件來實現,打開該文件,并將相關內容修改如下:
<identity impersonate="true"
userName="wcb02h26\Niranjan"
password="venezia143"/>
當運行RootFolderForm.aspx的時候,將得到一個錯誤信息,指明“identity”不能被修改。這是因為,默認的,ASP.NET不能將進程委派給別的用戶,為了解決這個問題,我們必須修改本地安全策略。打開“管理工具”->“本地安全策略”,點擊“本地策略”文件夾下的“用戶權利指派”,雙擊“作為服務登錄”并增加“ASPNET”賬號,參照下圖(圖七)設置。重新啟動服務器,當再次運行RootFolderForm.aspx的時候,將看到顯示出“wcb02h26\Niranjan”。
這里,Identity可以針對不同的具體應用設置不同的值,下面我們為“ConfigApplication”設置不同的值,對Machine.Config作以下修改:
修改Identity值為True:<identityimpersonate="true"/>
增加以下內容到Machine.Config文件的<system.web>標記末尾,<configuration>標記前面。
<locationpath="Default Web Site/ConfigApplication" allowOverride="false">
< system.web >
< identity impersonate ="true" userName ="wcb02h26\Niranjan" password ="venezia143" />
</ system.web >
</location>
以上的“Location”部分可以通過“Path”設置特定WEB應用的Identity,“allowOverride”可以設置是否可以被應用的WEB.Config設置重寫。在我們的舉例中,我們使用用戶“wcb02h26\Niranjan”運行ASP.NET,因為“allowOverride”設置為“False”,所以,這個設置不能被Web.Config重寫,這樣設置以后,當運行RootFolderForm.aspx的時候,我們看不出和上面提到的有什么區別,修改Web.Config文件的相關部分:
<identity userName="wcb02h26\test" password="test123"/>
這時再運行頁面,將看到以下錯誤信息(圖八),這時,就是“allowOverride="false"”這個設置生效了:
<SessionState>
SessionState用來保存ASP.NET應用的Session信息,在這里,我們不討論具體的Session應用等問題,而是重點關注Machine.Config的有關Session的一些設置怎樣允許和不允許某一個具體應用的Web.Config重寫的問題。
<Location>標記允許我們為一個具體的程序設置獨立的值,allowOverride屬性用來定義所有針對ASP.NET的設置都在機器層面起作用,而不能被具體程序的WEB.Config所改變。Machine.Config設置文件和Web.Config設置文件中,<sessionState>的默認設置如下:
<sessionState
mode="InProc"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source= 127.0.0.1;userid=sa;password="
cookieless="false"
timeout="20"
/>
現在,我們修改以上默認設置,為程序“ConfigApplication”設置一些特殊的值:
<sessionState
mode="StateServer"
stateConnectionString="tcpip=127.0.0.1:42424"
timeout="60"
/>
以上的設置保存程序的Session保留時間長為60分鐘,如果管理員希望以上的設置不被具體的應用所重寫,他就必須在以上的<Location>段增加一個allowOverride屬性,并且,將這個屬性的值設置為“False”。以下是程序“ConfigApplication”中與Session有關的一些設置:
<!-- For "Default Web Site/ConfigApplication" application -->
<locationpath="Default Web Site/ConfigApplication" allowOverride="false">
< system.web >
< identity impersonate ="true"
userName="wcb02h26\Niranjan"
password="venezia143"
/>
< sessionState mode ="StateServer"
stateConnectionString="tcpip=127.0.0.1:42424"
timeout="60"
/>
</ system.web >
</location>
以上設置的identity段,我們在前面已經詳細討論過,在SessionState段中,設置Session的保留時間為60分鐘,與Machine.Config的設置完全相同。
現在,我們講以上的<SessionState>段全部刪除,運行RootFolderForm.aspx頁面,可以發現,頁面可以正常無誤的輸出。現在,修改Web.Config中<SessionState>部分的值,繼續運行RootFolderForm.aspx頁面,我們發現出現以下錯誤信息(圖九):
但是,如果Machine.Config的“allowOverride”屬性設置為“True”,即使在應用的Web.Config中修改了相關設置,也不會出現以上的錯誤信息頁面,而且,Web.Config中的設置將發生作用,而Machine.Config中的設置將不再有效。
<appSettings>
本節我們將介紹怎樣繼承和重寫Machine.Config中的<appSettings>設置。以下是Machine.config中,針對程序“ConfigApplication”的一些專門設置,注意設置中“allowOverride”屬性是設置為“False”的。
<!-- For "Default Web Site/ConfigApplication" application -->
<locationpath="Default Web Site/ConfigApplication" allowOverride="false">
< system.web >
< identity impersonate ="true"
userName="wcb02h26\Niranjan"
password="venezia143"/>
< sessionState mode ="InProc"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1;user id=sa;password="
cookieless="false"timeout="30"/>
</ system.web >
< appSettings >
< add key ="myKey" value ="Value from machine.config" />
</ appSettings >
</location>
在以上的設置中,我們發現有一個新增加的鍵“myKey”,它的值為“Value from machine.config”。在頁面RootFolderForm.aspx中,我們在Page_Load部分增加以下代碼段:
// For <appSettings>
string strValue = System.Configuration.ConfigurationSettings.AppSettings["myKey"];
Response.Write("<h1> Value of myKey = " + strValue + "</h1>");
運行RootFolderForm.aspx頁面,我們可以看到,“Value from machine.config”顯示在頁面上(圖十)。
由這里我們可以發現,加入Page_Load中的代碼其實就是顯示MyKey這個鍵的值。
現在,在程序的WebConfig.config部分,我們同樣增加一個MyKey鍵,將它的值設置為“Value from web.config”,以利于區別。
<appSettings>
< add key ="myKey" value ="Value from web.config" />
</ appSettings >
再一次運行頁面,將出現錯誤信息(圖十一):
因為在Machine.Config中,我們已經設置“allowOverride”為“False”,這樣,當Web.Config中設置同樣的鍵時,就出現了錯誤。我們可以將Machine.Config中的“allowOverride”設置為“True”,再一次運行頁面,將不會出現錯誤信息,Web.Config中設置的值也會正常顯示(圖十二):
另外,當Machine.Config中的“allowOverride”設置為“False”以后,即使在Web.Config中設置新的鍵,也不能正常運行,同樣出現錯誤信息。
轉載于:https://www.cnblogs.com/chinafine/archive/2007/02/14/650194.html
總結
以上是生活随笔為你收集整理的理解并使用ASP.NET的高级配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET 指南:实现 Equals 方法
- 下一篇: 三层设计模式初步分离