ASP.NET MVC身份認證與授權

一、引言

1.身份認證的含義

例如:在現在瀏覽的某寶電商網站中會經常遇到的情況,想要將某件商品加入到購物車,點擊“加入購物車”之後彈出的卻是登錄界面。這個就是所謂的請求的身份認證

2.身份認證與Session

基於Session保存用戶狀態

(1)基於Session保存用戶狀態和信息,比如:用戶登錄信息,相當於授權
(2)在訪問具體頁面時,如果檢測到沒有登錄,則禁止用戶某些動作

不足之處

(1)Session具有生命週期,超過規定時間,用戶就必須要重新登錄
(2)Session有各種丟失的可能,例如服務器重啓,內存回收等,這樣會影響用戶的體驗

二、ASP.NET身份驗證

驗證方式 說明
Windows 使用windows操作系統和NTFS文件系統驗證,適合公司內部站點使用,不適合大衆商業站點
Forms 利用網頁向客戶端發送憑證,客戶端再把憑證提交給應用程序進行身份認證(使用最普遍)
Passport 一種單點登錄標準(微軟提供,使用需要付費,國內採用的較少)
Federated 一種單點登錄標準(谷歌提供,一種聯合身份驗證標準)

Forms驗證

(1) 在實際開發中應用最普遍
(2)最初由亞馬遜網站開發使用,在內部使用Cookie來維護頁面之間的狀態
(3)在ASP.NET MVC中提供了一個FormsAuthentication類專門用於身份認證服務
(4) FormsAuthentication類的一個功能就是寫入一個標識用戶身份的Cookie

FormsAuthentication類

屬性或方法 說明
string LoginUrl 用戶訪問且驗證不通過時,重定向到的登錄頁面的URL
TimeSpan TimeOut 獲取身份驗證票證的到期前的時間量
void SetAuthCookie(string userName,bool createPersistentCookie) 爲提供的用戶名創建一個身份驗證票據,並將該票據添加到響應的Cookie集合或Url中,常用於登錄
viod SignOut() 從瀏覽器中刪除Forms身份驗證票據,常用語註銷
string Encrypt(FormsAuthenticationTicket ticket) 將驗證票據對象加密成一個字符串
FormsAuthenticationTicket Decrypt(string encryptedTicket) 將加密過的用戶身份票據字符串解密成一個票據對象

驗證案例

1.Forms驗證案例

(1)編寫帶有身份驗證的登錄動作方法

[HttpPost]
        public ActionResult UserLogin(UserInfor user)
        {
            UserServer server = new UserServer();
            UserInfor currentUser = server.UserLogin(user);
            if (currentUser!=null)//登錄成功
            {
                //爲當前用戶名提供一個身份驗證票據,並將該票據添加到Cookie
                FormsAuthentication.SetAuthCookie(currentUser.Name,false);
                ViewBag.Infor = $"歡迎您:{currentUser.Name}";
                return View("Index");
            }
            else
            {
                ViewBag.Infor = "用戶名或密碼錯誤!";
                return View("Login");
            }   
        }
 <div> 
        <form action="~/Home/UserLogin" method="post">
            <table>
                <tr>
                    <td>
                        用戶名:
                    </td>
                    <td>
                        <input type="text" name="Id" value="" />
                    </td>
                </tr>
                <tr>
                    <td>
                        密碼:
                    </td>
                    <td>
                        <input type="password" name="Pwd" value="" />
                    </td>
                </tr>
                <tr>
                    <td>
                    </td>
                    <td>
                        <input type="submit" value="登錄" />
                    </td>
                </tr>
            </table>
            <div>
                @ViewBag.Infor
            </div>
        </form>
    </div>

SetAuthCookie方法中的兩個參數

  1. 第一個參數給currentUser.Name當前登錄人員的名字,也就是驗證票據存在,那麼驗證票據中保存的就是登錄人員的名字
  2. 第二個參數如果爲true,表示永遠不過期的Cookie,只要用戶登錄後,以後都不需要進行重新登錄了除非客戶端主動把Cookie清除

2.使用User對象檢查用戶是否已驗證

User對象封裝了用戶身份票據
可用於控制代碼的權限

public ActionResult UserManager()
        {
            if (this.User.Identity.IsAuthenticated)
            {
                string adminName = this.User.Identity.Name;//讀取寫入的AdminName
                ViewBag.adminName = adminName;
                UserServer server = new UserServer();
                ViewBag.AdminList = server.GetUserInfors();
                return View();
            }
            else
            {
                return RedirectToAction("Login", "Home");
            }
        }

3.修改根目錄中Web.config配置文件

  <system.web>
    <compilation debug="true" targetFramework="4.7"/>
    <httpRuntime targetFramework="4.7"/>
    <authentication mode="Forms">
      <forms loginUrl="~/Home/Login" timeout="2880"></forms>
    </authentication>
  </system.web>

(1) mode:身份驗證的方式(Forms,None,Password,Windows)
(2) loginurl:當前用戶直接訪問帶有驗證檢測的頁面時,如果沒有驗證通過,跳轉到url(一般都設置的是登錄頁面)
(3) timeout:Cookie的有效期,單位爲“分鐘”,2880表示兩天時間
只要是哪個頁面需要做用戶身份認證動作方法中都要寫一個判斷,所以相對而言比較繁瑣

4.用戶註銷

用戶登錄之後,根據需要可以註銷當前用戶票據

		 public ActionResult UserExit()
        {
            FormsAuthentication.SignOut();
            return View("~/Home/Index");
        }

四、身份授權

Authorize特性實現授權

Authorize特性

  1. 更方便的實現身份授權
  2. 應用在控制器上:擁有票據的用戶具備訪問這個控制器內所有動作方法的權限,如果要使用則必須要考慮清楚,是否在控制器中的每個動作方法都需要進行身份驗證,如果哪個方法不需要身份驗證,則這個方法不應該出現在這個控制器中
  3. 應用在動作方法上:擁有票據的用戶具備訪問該動作方法的權限,和給每個動作方法中添加票據驗證效果一樣,哪個動作方法具有該特性則就會有驗證

注意

使用Authorize特性實現授權和User對象效果相同,但是Authorize可以實現更多複雜的功能

Authorize實現高級授權案例

可以按照指定用戶名進行授權

            [Authorize(Users ="小紅")]
            public ActionResult UserManager()
            {
                string adminName = this.User.Identity.Name;//讀取寫入的AdminName
                ViewBag.adminName = adminName;
                UserServer server = new UserServer();
                ViewBag.AdminList = server.GetUserInfors();
                return View();
            }

只有當登錄用戶的名字是"小紅"的時候才能通過身份驗證,其他人沒有權限進入管理界面

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章