文章目錄
一、引言
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方法中的兩個參數
- 第一個參數給currentUser.Name當前登錄人員的名字,也就是驗證票據存在,那麼驗證票據中保存的就是登錄人員的名字
- 第二個參數如果爲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特性
- 更方便的實現身份授權
- 應用在控制器上:擁有票據的用戶具備訪問這個控制器內所有動作方法的權限,如果要使用則必須要考慮清楚,是否在控制器中的每個動作方法都需要進行身份驗證,如果哪個方法不需要身份驗證,則這個方法不應該出現在這個控制器中
- 應用在動作方法上:擁有票據的用戶具備訪問該動作方法的權限,和給每個動作方法中添加票據驗證效果一樣,哪個動作方法具有該特性則就會有驗證
注意
使用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();
}
只有當登錄用戶的名字是"小紅"的時候才能通過身份驗證,其他人沒有權限進入管理界面