ASP.NET Forms 認證 Forms認證基礎 1. HTTP是無狀態的協議,也就是說用戶的每次請求對伺服器來說都是一次全新的請求,伺服器不能識別這個請求是哪個用戶發送的。 2. 那伺服器如何去判斷一個用戶的請求呢? 3. 答案是在每次請求發送時,附帶一些其他的信息來識別用戶的請求 4. 對於 ...
ASP.NET Forms 認證
Forms認證基礎
HTTP是無狀態的協議,也就是說用戶的每次請求對伺服器來說都是一次全新的請求,伺服器不能識別這個請求是哪個用戶發送的。
那伺服器如何去判斷一個用戶的請求呢?
答案是在每次請求發送時,附帶一些其他的信息來識別用戶的請求
對於Forms認證,每次的請求都攜帶同樣的cookie信息,將此信息發送給伺服器,這樣伺服器就可以識別這個請求到底是哪個用戶的。
ASP.NET Forms 認證基礎
ASP.NET Request.IsAuthenticated為true 代表此用戶已經登陸
使用 HttpContext.User 來表用用戶的信息
ASP.NET Forms 認證過程
ASP.NET 檢查當前的請求,並根據Web.config中配置的認證方式去構造HttpContext.User 供後續處理
後續可以通過判斷HttpContext.User 信息來識別用戶信息
ASP.NET Forms 登陸與註銷
使用vs2017 新建一個MVC程式,不進行身份驗證
在Web.config 的system.web 配置節新增Forms認證信息,內容如下
<authentication mode="Forms" >
<forms cookieless="UseCookies" name="FormsCookie" loginUrl="~/Home/Index.cshtml"></forms>
</authentication>
- 我們使用 Request.IsAuthenticated 來判斷用戶是否登陸,我們來做一個登陸頁面
<div>
<fieldset>
<legend>用戶登陸</legend>
<form action="/Home/Login" method="post">
用戶名:<input type="text" name="loginName" style="width:200px;" />
密 碼:<input type="password" name="loginPwd" style="width:200px" />
<input type="submit" value="登錄" />
</form>
</fieldset>
</div>
- 後臺驗證密碼成功後跳轉到歡迎的頁面
public ActionResult Login(string loginName,string loginPwd)
{
if (string.IsNullOrEmpty(loginName) || string.IsNullOrEmpty(loginPwd))
return Redirect("Index");
if (loginName == "Admin" && loginPwd == "Admin")
{
FormsAuthentication.SetAuthCookie(loginName, true);
return RedirectToAction("Index", "Welcome");
}
else
{
return Redirect("Index");
}
}
- 在歡迎頁面如果已登錄顯示用戶名,如果未登錄顯示登錄地址進行登錄
<div>
<fieldset>
<legend>
歡迎
</legend>
@if (Request.IsAuthenticated)
{
@: 你好 @Context.User.Identity.Name
}
else
{
<div>
還未登錄,請進行 <a href="/Home/Index">登錄</a>
</div>
}</fieldset>
</div>
總結
可以看到我們在驗證完用戶名和密碼後,只是調用了 FormsAuthentication.SetAuthCookie(loginName, true); 執行完之後ASP.NET 就可以識別此用戶後續的請求。這個方法幫我們做瞭如下流程:
用戶登錄流程
根據用戶名創建一個FormsAuthenticationTicket對象
調用FormsAuthenticatin.Encrypt() 進行加密
根據加密結果創建名稱為 FormsCookie (來自Web.config中的配置) 的cookie
將此cookie 寫入Response 返回給瀏覽器
瀏覽器在進行後續請求時會攜帶此cookie到服務端。
每次請求時的認證流程
瀏覽器在發送請求時攜帶cookie信息
FormsAuthenticationModule 讀取cookie
從cookie中解析出FormsAuthenticationTicket 對象,過期的對象將被忽略
根據FormsAuthenticationTicket 對象構造 FormsIdentity對象並設置HttpContext.User
ASP.NET 程式後續 HttpContext.User來判斷用戶信息
到此我們已經完成正整個認證流程。
更多詳細內容請參見大神 Fish Li (李奇峰)