[ASP.NET] Forms 驗證與授權

  • 8060
  • 0

過去對於 ASP.NET 的驗證一直沒去研究,最近覺得不行,連這基礎都沒有,還想踏入網站的 Coding,

一開始我就下個關鍵字 Google 一下:『ASP.NET 驗證』,

嗚~ 看到 msdn 的文章我是還蠻喜歡看一下的,雖然 msdn 的文章沒有這麼好懂,

但其實看久了,你熟悉 msdn 文章的閱讀方式後,看起來也能很順眼,

廢話太多,來進入正題。

 

先說驗證(Authentication)跟授權(Authorization)是兩件事情,

一定是先驗證,然後才能授權,所以網站的 Controller 或 Action 有加上 AuthorizeAttribute的話,

意思是說這個功能是要有授權才能執行的,如果沒有授權,就會依照預設或自訂的導向登入網址去,

所以下面來談談看 ASP.NET 驗證方式,

詞彙 定義

Windows 驗證提供者

提供如何將 Windows 驗證與 Microsoft 網際網路資訊服務 (IIS) 驗證搭配使用,以保護 ASP.NET 應用程式的相關資訊。

表單驗證提供者

提供如何使用自己的程式碼建立特定應用程式登入表單以及執行驗證的相關資訊。使用表單驗證的簡便方法是使用 ASP.NET 成員資格和 ASP.NET 登入控制項,二者一起使用,提供了一種只使用少量或不使用程式碼,便可收集使用者認證、驗證認證並管理認證的方法。如需詳細資訊,請參閱 使用成員資格管理使用者 和 ASP.NET 登入控制項概觀

Passport 驗證提供者

提供集中式驗證服務的相關資訊,該服務由 Microsoft 提供,並為成員站台提供單一登入和核心設定檔服務。

上面是從 msdn 複製重點的定義過來,

我對於 Windows 與 Passport 沒用到過,甚至覺得相對一般公開網站也很少在用,

比較常見的就是表單驗證(FormsAuthentication),使用方式也很容易,

步驟1: 在 Web.config 的 system.web 項目 增加 

  <system.web>
    <authentication mode="Forms">
    </authentication>
  </system.web>

mode 就是告知我們在這網站中,想要使用哪種驗證方式,這裡我們就選擇 Forms(更多驗證設定請看這邊),

接著只要使用 FormsAuthentication 類別,來授權給給某個使用者名稱,就能讓 ASP.NET 網站認識這個使用者已通過驗證識別,

我們就能在像是 Controller 有個屬性叫做 User,或是 cshtml 裡面也能用這個屬性,

透過 User.Identity.Name 可以取得目前這個驗證通過的使用者稱,

User.Identity.IsAuthenticated 能識別目前這個 Request 是否已驗證,

例如如果帳號密碼判斷成功了,我想授權給這個使用者名稱 Walter,最簡單的用法就是

FormsAuthentication.SetAuthCookie("Walter", createPersistentCookie: true);

當然實際上 "Walter" 一定是個變數,可能是網頁上輸入的帳號或資料庫撈出來的 UserName,

這樣在 Response 的 Headers 裡面加入Set-Cookie,讓瀏覽器能為這個 Domain 設定 Cookie,

之後只要是在這 Domain 網頁所送出的任何 Request,就會附加上 Cookie Header,

ASP.NET 收到這請求後,就會處理表單驗證事件,表單驗證預設就會將 Cookie 進行解密,

驗證通過的話,該次 Request 會建立 ClaimsPrincipal,就能知道是哪個 UserName,

SetAuthCookie 方法裡面有個 createPersistentCookie 參數,這就是登入時,通常都會有個"記住我"的打勾選項,

從 Chorme 的 Resources 查看 Cookies 就能看出在 createPersistentCookie: false (不要記住我),的 Expires / Max-Age 是 Session,意思是關閉瀏覽器後,Cookie 就沒了,

相反將 createPersistentCookie: true (記住我),你關閉瀏覽器,又開瀏覽器查看這網頁的話,還是登入狀態的,直接過期為止,

登出的方法也很容易,只要在登出地方加上

FormsAuthentication.SignOut();

這樣就只能使瀏覽器將 Cookie 清除,意思是只有瀏覽器移除這個 Cookie 而已!!

但如果有人記錄下了你的 Cookie,他還是繼續使用這個授權的身分的!!

所以在登出的時候,也建議將相關的資料清除,並將 Expires 設為過期,例如像這篇文章

上面都是用最簡單的方式去做驗證,如果想要自訂 Cookie 過期日期還是額外資料的,

可以建立 FormsAuthenticationTicket,然後使用 FormsAuthentication.Encrypt 加密,

在建立 HttpCookie,增加到 Response.Cookies,意思也是自訂 Cookie,回應給瀏覽器,讓瀏覽器設定在這 Domain 擁有這 Cookie哦。

 

上面談到的是傳統 ASP.NET 依賴 System.Web.dll,才使用 FormsAuthentication,

如果要擺脫 System.Web.dll,請還想用類似 Forms 這種方式驗證的話,

看來只能下篇來寫 OWIN 的驗證了。

 

 

以上,內容有誤請回報,純屬筆記。

參考文章:

ASP.NET 驗證
表單驗證控制流程
MVC5 - ASP.NET Identity登录原理 - Claims-based认证和OWIN