在使用市面上各種網站平台時,都會使用到會員的功能,例如我們的簡訊系統平台也有運用identity相關的功能,所以如果今天假如想要在MVC的架構中實作,使用identity是最方便的,就讓我們一起來認識認識MVC的identity吧!
首先簡單介紹一下identity的DB架構
- AspNetRoles => 紀錄角色資訊
- AspNetUserClaims => 身分驗證
- AspNetUserLogins => 登入紀錄
- AspNetUserRoles => 使用者與角色的對應
- AspNetUsers => 記錄使用者資訊,其中密碼為加密過,且每次相同密碼加密後也不會相同
一開始建立一個空白的MVC專案
點選變更驗證,並選擇個別使用者帳戶,接著建立專案
接著會在App_Start資料夾中,看到IdentityConfig;Controllers資料夾中看到AccountController
之後就可以開始我們的設定了,在 App_Start內的IdentityConfig中去設定,其中manager.UserValidator內的為設定使用者名稱的驗證邏輯,manager.PasswordValidato為設定密碼的驗證邏輯,而各個屬性的用途如下
屬性名稱 | 用途 |
AllowOnlyAlphanumericUserNames | 允許使用者名稱可以只有數字 |
RequireUniqueEmail | 電子郵件不能重複 |
RequiredLength | 密碼所需的最小長度 |
RequireNonLetterOrDigit | 密碼須包含特殊字元 |
RequireDigit | 密碼需包含數字 |
RequireLowercase | 密碼須包含小寫英文 |
RequireUppercase | 密碼須包含大寫英文 |
在設定完使用者名稱與密碼的規則後,如果發現IdentityConfig提供的規則不夠使用時該怎麼辦呢,這時可以新增一個自己的Class並去繼承原本的Class就可以解決啦,此時我們新增一個CustomPwdValidator.cs,而其中password 就是使用者輸入的密碼,所以要驗證就可以使用正規表示法或是其他方法去檢查
並把原本IdentityConfig中manager.PasswordValidato new 的類別改成CustomPwdValidator我們剛剛所新增的類別,之後就可以在CustomPwdValidator去設計自己需要的規則了
像是筆者之前就遇到需要檢查密碼是否有連續性的問題,例如12345、abcde這種密碼甚至是111、aaa這些密碼都需要擋住不讓使用者註冊,這時候就需要在剛剛CustomPwdValidator內加設定,首先先加上
static string PwdFailMsg = “”; //作為儲存錯誤資訊
並且新增了PwdContinueValid方法去檢查,要是不通過回傳false,通過則直接回傳result
bool PwdContinueValid(string password) { int PwdContinue = 3; //密碼連續次數 int PwdRegularity = 3; //密碼重複次數 //檢查密碼有無連續*次 if (PwdContinue != 0) { for (int i = 0; i <= password.Length - PwdContinue; i++) { int count = 0; for (int j = 0; j < PwdContinue - 1; j++) { if ((int)password[i + j] + 1 == (int)password[i + j + 1]) { count++; } if (count == PwdContinue - 1) { PwdFailMsg = $"密碼不可以使用連續的{PwdContinue}個字當密碼"; return false; //檢查到密碼連續 } } } } //檢查密碼有無重複*次 if (PwdRegularity != 0) { for (int i = 0; i <= password.Length - PwdRegularity; i++) { int count = 0; for (int j = 0; j < PwdRegularity - 1; j++) { if ((int)password[i + j] == (int)password[i + j + 1]) { count++; } if (count == PwdRegularity - 1) { PwdFailMsg = $"密碼不可以使用相同的{PwdRegularity}個字當密碼"; return false; //檢查到密碼重複 } } } } return true; //檢查完畢 }
筆者是利用抓取密碼第一個字,並向後檢查兩位字元,檢查完後再檢查第二位字元,並在向後檢查兩位字元,直到密碼無法在檢查後兩位字元時停止;而檢查的方法為將字元轉成ascii碼後再去做檢查,abc的ascii碼一定是連續的,0~9為48~57,A~Z為65~90,a~z為97~122,利用ascii碼也可以過濾掉其他你想過濾的字元
總結:
Identity在MVC架構上,扮演十分重要的角色,比起以前自己慢慢打造會員系統,還要開許多資料表做連結、設計等等,Identity直接使我們能夠快速開發會員驗證的相關功能,而且也非常容易去擴充,也可以輕鬆地以Microsoft、Google、Facebook、Twitter的帳號做結合,或是設定使用者的角色,並控制他的權限,這一次先介紹入門,下一次筆者會介紹如何去使用Identity的資料庫內容,以便實現密碼歷史紀錄的功能,敬請期待吧!
參考資料:
書籍 – ASP.net MVC5 網站開發美學