MVC identity的基本應用

在使用市面上各種網站平台時,都會使用到會員的功能,例如我們的簡訊系統平台也有運用identity相關的功能,所以如果今天假如想要在MVC的架構中實作,使用identity是最方便的,就讓我們一起來認識認識MVC的identity吧!

 

首先簡單介紹一下identity的DB架構

  • AspNetRoles => 紀錄角色資訊
  • AspNetUserClaims => 身分驗證
  • AspNetUserLogins => 登入紀錄
  • AspNetUserRoles => 使用者與角色的對應
  • AspNetUsers => 記錄使用者資訊,其中密碼為加密過,且每次相同密碼加密後也不會相同

 

一開始建立一個空白的MVC專案

MVC identity
 
 
點選變更驗證,並選擇個別使用者帳戶,接著建立專案
 
 
MVC identity
 
接著會在App_Start資料夾中,看到IdentityConfig;Controllers資料夾中看到AccountController
 
MVC identity
 

之後就可以開始我們的設定了,在 App_Start內的IdentityConfig中去設定,其中manager.UserValidator內的為設定使用者名稱的驗證邏輯,manager.PasswordValidato為設定密碼的驗證邏輯,而各個屬性的用途如下

屬性名稱 用途
AllowOnlyAlphanumericUserNames 允許使用者名稱可以只有數字
RequireUniqueEmail 電子郵件不能重複
RequiredLength 密碼所需的最小長度
RequireNonLetterOrDigit 密碼須包含特殊字元
RequireDigit 密碼需包含數字
RequireLowercase 密碼須包含小寫英文
RequireUppercase 密碼須包含大寫英文
MVC identity
 

在設定完使用者名稱與密碼的規則後,如果發現IdentityConfig提供的規則不夠使用時該怎麼辦呢,這時可以新增一個自己的Class並去繼承原本的Class就可以解決啦,此時我們新增一個CustomPwdValidator.cs,而其中password 就是使用者輸入的密碼,所以要驗證就可以使用正規表示法或是其他方法去檢查

 

 
MVC identity
 
 

並把原本IdentityConfig中manager.PasswordValidato new 的類別改成CustomPwdValidator我們剛剛所新增的類別,之後就可以在CustomPwdValidator去設計自己需要的規則了

 

MVC identity
 
 

像是筆者之前就遇到需要檢查密碼是否有連續性的問題,例如12345、abcde這種密碼甚至是111、aaa這些密碼都需要擋住不讓使用者註冊,這時候就需要在剛剛CustomPwdValidator內加設定,首先先加上

static string PwdFailMsg = “”; //作為儲存錯誤資訊

並且新增了PwdContinueValid方法去檢查,要是不通過回傳false,通過則直接回傳result

 

 
MVC identity
 
 
 
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 網站開發美學

Comments

No comments yet. Why don’t you start the discussion?

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料