ASP.NET安全認證(三): 用Form 表單認證實現單點登入

來源:互聯網
上載者:User
asp.net|安全

“等了好久終於等到今天,寫了好久終於就快完結,但是網友的反應卻讓我有一些的傷心。盼了好久終於盼到今天,忍了好久終於把此文撰寫,那些受冷落的無奈早就無所謂,累也不說累”(歌詞《今天》新演繹)。看著人家的 Blog 文章的評論是一條接一條,再瞧瞧自己:“無人問津呐,真…無…奈……唉,沒人理我,還是回家吧。”“哎,還沒開始寫,怎麼就走了?回去幹什麼呢?”回去寫作業去啊,上回交待的課外作業你做了沒?(註:http://blog.csdn.net/cityhunter172/archive/2005/11/13/528463.aspx 在第二部分第六節布置的課外作業:此項目有兩部門使用,其中每個部門分別都有些特定的頁面僅供本部門使用者瀏覽使用,請問該如何使用 Web.config 達到效果?)

不知有多少人做了作業,其實答案並不難。只需要在驗證使用者名稱與密碼後,取得該使用者的部門名稱或部門代碼,把它作為判斷的依據就行了。最好不要用部門的數字ID,那樣不利於以後的維護。

有一個秘密,一般人我不告訴他。Web.config 中的 <location> 節點的path 屬性可以是一張具體頁面的相對 URL 路徑,如下:<location path ="ManageSys/Auditing.aspx">

好了,接下來就要揭開“比根目錄Web.config 的作用範圍還大的設定檔”之謎啦,它就是藏匿在 Windows 系統目錄下,支配整個 .Net Framework 配置的傳說中的Machine.config !!下面請大家以熱烈的掌聲,歡迎我們這位神秘俠客的閃亮登場……

九、  Machine.config

Machine.config ,性別不詳,年齡未知,家庭出身:XML。深藏於“雲深不知處”的作業系統目錄下的某某地方(註:C:\WINDOWS【或 WINNT 】\Microsoft.NET\Framework\v1.1.4322【或 v1.0.3705 】\CONFIG),控制著“更上一層樓”的 .NET Framework 的本機配置。接下來簡要的講解一下它的內容,以及它與 Web.config 的關係。

經過“松下問童子”,我們好不容易找到這位隱者,開啟一看,乖乖,足有 3700 多行!!“叫我怎麼能不難過,偶只想看看是啥結構,可內容實在是太多太繁瑣……”還記得偶經常對同事說的一句話麼:“辦法是人想出來的!”它不是有三千七百多行嗎,那我們就不管三七能否得出二十一啦,把它拷出來先。它不是 XML 出身嗎,那咱們就還其正身,重新命名為“machine.xml”。接著用 IE 瀏覽器將這位改頭換面的隱者開啟,把節點與注釋一一合攏。這回你看到了吧,是不是很有成就感?你要是想謝謝我,就讓我看到你在此文下面的評論吧。多多益善,呵呵。

Machine.config 與 Web.config 是啥關係?四個字 —— 父子關係。記得我在第二部分第五節講解 Web.config 作用範圍的時提到兩點 —— 繼承與覆蓋(詳見http://blog.csdn.net/cityhunter172/archive/2005/11/13/528463.aspx),在此也同樣適用。

1、  Machine.config 中的設定將作用於運行在原生所有網站及其虛擬目錄,遇到子目錄將一直繼承下去。

2、  Web.config 中的設定將覆蓋由 Machine.config 中繼承下來的對應的節點設定

說到這,再告訴大家一個秘密 —— “世上本無秘密,知道的人多了,便成了不是秘密的秘密!”

a、  Machine.config 中的 <system.web> 節點所有內容都能出現在項目根目錄下的 Web.config 中,也就是說能在 Web.config 中的內容已經在 Machine.config 中一一列出;

b、  其中 <system.web> 節點下的 <pages> 還能出現在頁面上,如: HTML 視圖下,在WebForm1.aspx 的第一行加上<pages> 的節點內容validateRequest="false" (此句意思是不對WebForm1.aspx頁面文字框輸入的值,是否包含 “<” “>” 等等具有危險性的代碼進行檢查,下一節將具體運用到)

<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="FromTest.WebForm1" validateRequest="false"  %>

十、  單點登入(Single Sign On)的前提條件

之前說了這麼多關於 Machine.config 的事,都是為了實現單點登入作鋪墊,那何為單點登入(Single Sign On)?從字面理解就是在一個地方登入,通常運用於 ASP.NET 分布式環境中(跨單個伺服器上的多個應用程式或在網路場中)的 Forms 身分識別驗證。打個比方,就好比現在 Sohu(搜狐) 與 Chinren(中國校友錄) 的做法,我在 Sohu 登入以後就不需要在 Chinaren 登入了。台灣與香港又把 Single Sign On 稱之為“單一登入”。

要想實現此功能,首要條件是需要一組用於加密與驗證加密的密鑰。它們位於 Machine.config 中,修改  <system.web> 節點下的 <machineKey> 節點屬性,如下:

     <machineKey firstKey="172" copyrightKey="Cityhunter172" validationKey="AD117F2F286CDCB15A9D1D4535E16DB0248026939**AUTHOR**CITYHUNTER172****WEBSITE**172*MEIBU*COM****MAILTO**CITYHUNTER172@126*COM*****F2F286CDCB15A9D1D4535E16DB0248026939" secondKey="meibu" decryptionKey="3C89AE62AD117F2F286CDCB15A9D1D4535E16DB0248026939" validation="SHA1" thirdKey="com" />

1、  validationKey 為用於驗證加密資料的密鑰。最小長度為 40 個字元(20 位元組),最大長度為 128 個字元(64 位元組)。

2、  decryptionKey 為用於加密資料的密鑰。長度只有 16 個字元(8 位元組)與 48 個字元(24 位元組)兩種。

3、  validation 為用資料驗證使用的加密類型。擁有“SHA1”“MD5”“3DES”三種方法

4、  大夥參照上述 <machineKey> 試著在WebForm1.aspx運行下列語句:

this.TextBox2.Text ="ht"+"tp"+"://"+firstKey+"."+secondKey +"."+thirdKey

大家在修改之前請先備份一下 Machine.config ,到時要是出錯可別怪我沒提醒你。以上密鑰並不是胡亂得來的,接下來向大家介紹產生密鑰的方法。

我們把上一節中提到的 WebForm1.aspx 拖入本項目的 Public 目錄下,再往頁面上拖入一個 TextMode=MultiLine 的TextBox3 與一個 Button 編寫按鈕事件與函數:

   private void Button1_Click(object sender, System.EventArgs e)

   {

        string decStr = this.CreateKeyString(int.Parse(this.TextBox1.Text));

        string valStr = this.CreateKeyString(int.Parse(this.TextBox2.Text));

        this.TextBox3.Text=string.Format("<machineKey validationKey=\"{0}\" decryptionKey=\"{1}\" validation=\"SHA1\"/>",valStr,decStr);

     }

   /// <summary>

   /// 產生加密型強隨機 Key 值

   /// </summary>

   /// <param name="i">Key 的有效長度:

   /// decryptionKey 的有效值為 8 或 24;

   /// validationKay 的有效值為 20 至 64

   /// </param>

   private string CreateKeyString(int i)

   {

        System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider();  //加密隨機數產生器

        byte[] bt = new byte[i];

        rng.GetBytes(bt);//用加密型強隨機值序列填充位元組數組

        System.Text.StringBuilder str = new System.Text.StringBuilder();

        for(int j= 0;j<i;j++)

        {

             str.Append(string.Format("{0:X2}",bt[j])); //轉換成大寫的十六進位文本

        }

        return str.ToString();

   }

每次點擊按鈕產生密鑰都不同,大家不妨多點幾次。切換至 HTML 視圖,到WebForm1.aspx 第一行把 validateRequest="false" 去掉,然後再多點幾次 Button1試試,看看會有什麼效果,嘿嘿………

[1] [2] [3] 下一頁  



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。