1. 程式人生 > >ASP.NET 安全認證(Form 認證)

ASP.NET 安全認證(Form 認證)

第三部分實現單點登入(Single Sign On 

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

達到效果?)

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

有一個祕密,一般人我不告訴他。Web.config中的 <location>節點的path屬性可以是一張具體頁面的相對 URL路徑,如下:<locationpath ="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瀏覽器將這位改頭換面的隱者開啟,把節點與註釋一一合攏。這回你看到了吧,是不是很有成就感?你要是想謝謝我,就讓我看到你在此文下面的評論吧。多多益善,呵呵。

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**[email protected]*COM*****F2F286CDCB15A9D1D4535E16DB0248026939"secondKey="meibu" decryptionKey="3C89AE62AD117F2F286CDCB15A9D1D4535E16DB0248026939"validation="SHA1" thirdKey="com" />

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

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

3、 validation為用資料驗證使用的加密型別。擁有“SHA1MD53DES”三種方法

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

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

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

我們把上一節中提到的WebForm1.aspx 拖入本專案的 Public 目錄下,再往頁面上拖入一個 TextMode=MultiLineTextBox3與一個 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試試,看看會有什麼效果,嘿嘿………

十一、單點登入(Single Sign On)的站點示例

將上述 TextBox3產生的文字,覆蓋Machine.config中的,現在你的機器已經具備了單點登入的條件。大夥可以再新建一個專案FormTest2 ,從 FormTest2 登入後直接輸入 FormTest中的Default.aspx的網址(http://localhost/FormTest/ Default.aspx),反之亦可。

下面結合例項講解:偶在山東每步科技網站申請了一個免費二級域名 172.meibu.com,並下載了每步的 4.0版的動態域名解析客戶端。現在使用 ADSL拔號上網,也就是說我的電腦已經成了 Web伺服器,同時支援 SQL ServerOracle空間高達 200 G想怎麼弄就怎麼弄,夠牛吧,嘿嘿。佈署上來的專案有環勝數碼網站、許可權管理系統、IT內部管理網,以上三個專案是偶一人全權開發的。所謂全權就是從資料庫儲存過程寫到 .cs程式碼再到 javascript,最後到美工都是偶一手搞定的。^_^我把這三個不相干的專案做成了單點登入的模式,加上整合站點的主頁面,共有四個地方可以進行登入。因為使用者 Table的結構不同,因此只有一個入口能在進入後,在跳轉站點時不會出錯,那就是在整合頁面登入。

現在我想把環勝數碼這個站點單獨脫離出來,而剩下的兩個站點繼續實現單點登入,該怎麼做呢?或者是我的 ASP.NET的空間是租的,服務商肯定不可能讓我修改 Machine.config ,我又咋辦哩?“辦法是人想出來滴!!”,根據上述 Machine.config Web.config的關係,我們可以把 <machineKey>節點放入專案根目錄下Web.config<system.web>節點。如下:

1、 許可權管理系統專案的 Web.config用於 Form認證的設定

<machineKeyvalidationKey="AD117F2F286CDCB15A9D1D4535E16DB0248026939**AUTHOR**CITYHUNTER172****WEBSITE**172*MEIBU*COM****MAILTO**[email protected]*COM*****F2F286CDCB15A9D1D4535E16DB0248026939" decryptionKey="3C89AE62AD117F2F286CDCB15A9D1D4535E16DB0248026939"validation="SHA1" />

<authenticationmode="Forms">

<formsloginUrl="Login.aspx"name="172.MEIBU.COM_WARRANT"></forms>

</authentication>

<authorization><denyusers="?"></deny></authorization>

2、 IT內部管理網專案的 Web.config用於 Form認證的設定

<machineKeyvalidationKey="AD117F2F286CDCB15A9D1D4535E16DB0248026939**AUTHOR**CITYHUNTER172****WEBSITE**172*MEIBU*COM****MAILTO**[email protected]*COM*****F2F286CDCB15A9D1D4535E16DB0248026939" decryptionKey="3C89AE62AD117F2F286CDCB15A9D1D4535E16DB0248026939"validation="SHA1" />

<authenticationmode="Forms">

<formsloginUrl="Login.aspx"name="172.MEIBU.COM_IT"></forms>

</authentication>

<authorization><denyusers="?"></deny></authorization>

大家可能會迫不急待的去試一把,偶贊成這樣的做法,因為事實是檢驗真理的唯一辦法。你不去試著自己動手,光看我在這說是很難提高的。先別急,我已經知道你想說什麼,聽聽我慢慢向你解釋:

a)兩個專案Web.cinfig<machineKey>節點確保以下幾個欄位完全一樣:validationKeydecryptionKeyvalidation

b)兩個專案的 Cookie名稱必須相同,也就是 <forms>中的 name 屬性,這裡我們把它統一為 name="172.MEIBU.COM_PROJECT"

c)注意區分大小寫

在整合的過程中,我把遇到的問題向大夥說一下,以免你們走同樣的路。

1)首先應該是使用者管理的問題,把兩個專案的使用者整合在一起,可不是一件容易的事,原則是新建一個新的 Table只存放帳號與密碼,用賬號做關聯,編寫觸發器,做到 Table之間的同步;

2)不要指望兩個專案間用 Session進行傳值,兩個應用程式的 Session是無法共享的。網上有人曾把類庫(編譯後的 .dll文件)放入同一個 bin資料夾實現過 Session共享,這樣的做法實際上是把兩個專案變相合併成一個應用程式,不是我們所想要的,理由很簡單:Sohu Chinaren的伺服器分處兩地該怎麼辦?

3)專案間的傳值,可用 Cookie實現。在第一部分的第三節()我們介紹了只要執行 System.Web.Security.FormsAuthentication.SetAuthCookie 方法即可實現登入,單點登入的實質就是含有身份驗證票的 Cookie能在專案間共用。

接下來,有必要向大家介紹一下 Cookie .Net中的用法。

十二、Cookie ASP.NET中的用法

大家也許和我一樣,很少在 ASP.NET中使用 Cookie,傳引數呀,存變數呀,用的比較多的是 Session ViewState以及隱藏控制元件,有的乾脆用“ ?”的請求方式。

1、 Cookie存放的目錄

      2、 Cookie 的有效期

      2、 Cookie 的有效期

      2、 Cookie 的有效期

從上圖我們可以清楚的看到每個 Cookie文件的“截止期”(即為有效期)。在有效期內,當登入計算機的使用者 Administrator再次訪問 172.meibu.com 時,那麼 IE就會在請求頁面的同時,連同上述的名稱為“Cookie:[email protected]”的Cookie文件內容一起傳送給伺服器。

若該文件包含多個 Cookie的值時,截止期則以最後的失效期為準。

3、 Cookie的型別

這裡我們按有效期來分,分為兩種:

a)即時型

指的是關閉瀏覽器(所有瀏覽 172.meibu.com IE)後,Cookie便失效,此類 Cookie不會在“Temporary Internet Files”目錄出現。其實它也有截止期的,為“0001-01-01

b)持久型

就是已指定具體“截止期”的,能夠在“Temporary Internet Files”目錄裡面找到的 Cookie

4、 Cookie的內容

  

  

上圖中,“■”是換行符,你若是要打破什麼鍋來問我到底是怎麼知道的話。我倒是會很樂意的告訴你:這就是經驗!偶從學習 C#那刻起,就拿第一個 Windows程式 —— 記事本 來開刀,儲存文件時得來的經驗。

  

  

5、  ASP.NET頁面發放 Cookie

傳送上述 Cookie .cs程式碼為:

              System.Web.HttpCookie ck =new HttpCookie("ckValue0");

              ck["Author"] ="CityHunter";

              ck.Expires = System.DateTime.Now.AddMinutes(10);//若不指定,則為即時型 Cookie

//ck.Path="/FormTest/ManageSys"; //設定 Cookie 的虛擬路徑,注意一定要以“/”開頭,否則為無效 Cookie ;請大家自行看一下它與在客房端的 Cookie 文件“名稱”與 “Internet 地址”的關係

              Response.Cookies.Add(ck); 

              ck = new HttpCookie("ckValue1"); //重新新建一個名為 ckValue1 的 Cookie

              ck.Expires = System.DateTime.Now.AddMinutes(20);  //即刻起 20 分鐘後失效

              ck["E_Mail"] ="[email protected]";        //設定 ckValue1 中的 E_Mail 值

              ck["PersonalWeb"] ="172.meibu.com";

     Response.Cookies.Add(ck);  //新增此 Cookie

6、 取回已發放 Cookie的值

Response.Write(Request.Cookies["ckValue0"]["Author"]+"<br>");//用不著說明了吧

Response.Write(Request.Cookies["ckValue1"]["E_Mail"]+"<br>");

Response.Write(Request.Cookies["ckValue1"]["PersonalWeb"]);

好久沒有出作業啦(何出此言?),這第三篇呀,可是花了偶兩個星期的業餘時間除錯、總結、撰寫哪,都說時光貴如金,不知我花的這些時間能換來多少銀子?換銀子,我看是沒指望啦,能得到閣下的一句評論,偶也滿足了。記住,你的評論就是偶繼續寫下去的動力。

作業:給 Cookie賦於以下值,怎樣得到它的正確值

              ck["str1"] ="2222";

              ck["str"] ="str0=11111&str1=223";

可以肯定的是Request.Cookies["ckValue1"]["str"]得不到 str0=11111&str1=223這個字串,大家不妨試一下Request.Cookies["ckValue1"]["str1"] 會得到意想不到的字串喲。

提示:使用Server.UrlEncode()Server.UrlDecode()

十三、發放永久性的驗證 Cookie

終於……終於……最後一個章節,驀然回首,洋洋灑灑十二章。沒想到年少時寫不完作文的偶,居然也能編出幾千餘字的文章來呀,不得不佩服偶自己呀!再回首,一大片暈倒的人……。永遠到底有多遠?永久究竟是多久?只有天知道

大家登入 CSDN的時候是否留意到一個“2周內不用再登入”的複選框,它又是怎麼做到的呢?大家是否曾遇到過這樣的困惑:在執行System.Web.Security.FormsAuthentication.SetAuthCookie時明明已指定createPersistentCookie true 為何關閉瀏覽器仍不能直接訪問網站?下面我們就這個問題給大家解釋一下,且介紹如何手工建立身份驗證票並加入 Cookie中。

     System.Web.Security.FormsAuthenticationTicket tk =new System.Web.Security.FormsAuthenticationTicket(

         1,                //指定版本號:可隨意指定

"Admin",//登入使用者名稱:對應 Web.config 中 <allow users="Admin" … /> 的 users 屬性

         System.DateTime.Now,  //釋出時間

         System.DateTime.Now.AddYears(100),  //失效時間:100 年以後,夠永夠久了吧

false,  //是否為持久 Cookie:尚未發現有何用,至少目前偶還不知,下面會有說明

"測試使用者資料"//使用者資料:可用 ((System.Web.Security.FormsIdentity)User.Identity).Ticket.UserData 獲取

         );

string str = System.Web.Security.FormsAuthentication.Encrypt(tk);//加密身份驗票

     //宣告一個 Cookie,名稱為 Web.config 中 <forms name=".APSX" … /> 的 name 屬性,對應的值為身份驗票加密後的字串

     System.Web.HttpCookie ck =new HttpCookie(System.Web.Security.FormsAuthentication.FormsCookieName,str);        

     //指定 Cookie 為 Web.config 中 <forms path="/" … /> path 屬性,不指定則預設為“/”

     ck.Path=System.Web.Security.FormsAuthentication.FormsCookiePath;  

//此句非常重要,少了的話,就算此 Cookie 在身份驗票中指定為永續性 Cookie ,也只是即時型的 Cookie 關閉瀏覽器後就失效;因此上面我說:我是真的還不知在身份驗票中指定為永續性 Cookie 有何用。

     ck.Expires = System.DateTime.Now.AddYears(100);

Response.Cookies.Add(ck);//新增至客房端

相關推薦

ASP.NET 安全認證Form 認證

第三部分實現單點登入(Single Sign On)  “等了好久終於等到今天,寫了好久終於就快完結,但是網友的反應卻讓我有一些的傷心。盼了好久終於盼到今天,忍了好久終於把此文撰寫,那些受冷落的無奈早就無所謂,累也不說累”(歌詞《今天》新演繹)。看著人家的 Blog文章的評論是一條接一條,再瞧瞧自己:“無人

ASP.NET Core免費視頻教程匯總

data cto ews 學生 .com 一個 演講 -a 客戶端 最近才開始學習ASP.NET Core,發現社區的學習資料很多,但是相關的視頻教程不是很多,52ABP官方有兩個視頻教程,但是ABP框架比較臃腫,初學者學起來有點吃力,所以還是推薦大家先啃書或者官方文檔,有

新思想、新技術、新架構——更好更快的開發現代ASP.NET應用程式續1

今天在@張善友和@田園裡的蟋蟀的部落格看到微軟“.Net社群虛擬大會”dotnetConf2015的資訊,感謝他們的真誠付出!真希望自已也能為中國的.NET社群貢獻綿薄之力。   上週星期天開通了部落格併發布了第一篇文章《新思想、新技術、新架構——更好更快的開發現代ASP.NET應用程式》,彙集了一些比較流

ASP.NET整合PayPal使用IPN

IPN:即時付款通知(Instant Payment Notify 簡稱IPN)PayPal設定說明:1、註冊測試帳號;2、對於“商家”賬戶的設定;設定完畢後,以下是程式碼部分首先:提交請求頁面(各個引數請根據需要修改)<form id="myForm" action=

ASP.NET 安全認證—— 如何運用 Form 表單認證 摘自 http://blog.csdn.net/cityhunter172

ASP.NET 安全認證(一)——如何運用 Form 表單認證作者:寒羽楓(cityhunter172)序程式碼寫 N 久了,總想寫得別的。這不,上頭說在整合兩個專案,做成單一登入(Single Sign On),也有人稱之為“單點登入”。查閱相關文件後,終於實現了,現在把它

ASP.NET 安全認證:如何運用 Form 表單認證

程式碼寫 N 久了,總想寫得別的。這不,上頭說在整合兩個專案,做成單一登入(Single Sign On),也有人稱之為“單點登入”。查閱相關文件後,終於實現了,現在把它拿出來與大家一起分享。或許大家會問:“這與標題不符呀?”別急,在下筆之前,我腦子裡想到了我剛使用 Form

ASP.NET 安全認證——巧妙實現 Form 表單認證跨站點、跨伺服器的單點登入Single Sign On

【原創】ASP.NET 安全認證(四) ——巧妙實現 Form 表單認證跨站點、跨伺服器的單點登入(Single Sign On) 作者:寒羽楓(cityhunter172) 第四部分 Form 認證的補充 前三篇在 CSDN 論壇公佈後,效果如同“神仙放屁——果然不同

ASP.NET Web API安全驗證之使用摘要認證(digest authentication)

在前一篇文章中,主要討論了使用HTTP基本認證的方法,因為HTTP基本認證的方式決定了它在安全性方面存在很大的問題,所以接下來看看另一種驗證的方式:digest authentication,即摘要認證。 系列文章列表 摘要認證原理 在基本認證的方式中,主要的安全問題來自於使用者資訊的明文傳輸,而

ASP.NET Web API安全驗證之使用HTTP基本認證

在前一篇文章ASP.NET Web API(一):使用初探,GET和POST資料中,我們初步接觸了微軟的REST API: Web API。 我們在接觸了Web API的後就立馬發現了有安全驗證的需求,所以這篇文章我們先來討論下安全驗證一個最簡單的方法:使用HTTP基本

ASP.NET 安全認證

——用Form 表單認證實現單點登入(Single Sign On) 作者:寒羽楓(cityhunter172) 第三部分 實現單點登入(Single Sign On) “等了好久終於等到今天,寫了好久終於就快完結,但是網友的反應卻讓我有一些的傷心。盼了好久終於盼到今天,

[轉]asp.net權限認證:HTTP基本認證http basic

border expr == gets tps ram word tro cred 本文轉自:http://www.cnblogs.com/lanxiaoke/p/6353955.html HTTP基本認證示意圖 HTTP基本認證,即http basic認證。 客

【第三篇】ASP.NET MVC快速入門之安全策略MVC5+EF6

對象 code word 單身 script ticket bsp 金額 class 【第一篇】ASP.NET MVC快速入門之數據庫操作(MVC5+EF6) 【第二篇】ASP.NET MVC快速入門之數據註解(MVC5+EF6) 【第三篇】ASP.NET MVC快速入門之

Asp.net安全架構之2:Session hijacking會話劫持

http://www.cnblogs.com/luminji/archive/2012/05/30/2511357.html 原理 會話劫持是指通過非常規手段,來得到合法使用者在客戶端和伺服器段進行互動的特徵值(一般為sessionid),然後偽造請求,去訪問授權使用

asp.net mvc 中的Form身份認證

預設的MVC4程式在配置檔案web.config中有以下配置     <authentication mode="Forms">       <forms loginUrl="~/Account/Login" timeout="2880" />   

不使用Visual Studio開發ASP.NET MVC應用下篇

構建 onf log rdquo 你們 err ica ide lan 書接上回! 前文“純手工”、徹底拋棄Visual Studio,制作了一個ASP.NET MVC應用,運行起來還不錯,項目目錄、源代碼、web.config等所有東西都已經做到

關於ASP.NET MVC的權限認證的一些總結

filter mode allow 檢查 art 權限 奇怪 dha 可執行 最近在學ASP.NET MVC的權限認證的一些東西,上網搜索了一陣,發現網上的方法大多數是以下幾類: 一、FormsAuthentication.SetAuthCookie(admin.Name,

Asp.net Security框架2

默認 隨機 async 技術分享 希望 win 認證 用戶認證 uget Asp.net 的Security框架除了提供Cookies,OAuth,ActiveDirectory等多個用戶認證實現,基本上已經滿足業務項目的開發需要了。 當需要實現OAuth2.0服務器端實現

探秘如何操作 ASP.NET Web API

asp ajax請求 log pic margin div 判斷 out turn 經過我三篇文章的解惑,webapi我相信大家沒有問題了! 先創建了一個UserModel public class UserModel { public string UserI

Asp.net Core 初探發布和部署Linux

gin pro 1.0 connect 本地 部署 .dll vs2015 是我 Asp.net Core 初探(發布和部署Linux) 前言 俗話說三天不學習,趕不上劉少奇。Asp.net Core更新這麽長時間一直觀望,周末帝都小雨,宅在家看了下Co

.net異步性能測試包括ASP.NET MVC WebAPI異步方法

睡眠時間 問題 none seconds await 數字 val http httpget 很久沒有寫博客了,今年做的產品公司這兩天剛剛開了發布會,稍微清閑下來,想想我們做的產品還有沒有性能優化空間,於是想到了.Net的異步可以優化性能,但到底能夠提升多大的比例呢?恰好有