1. 程式人生 > >ASP.NET Forms 認證流程

ASP.NET Forms 認證流程

class XML 設置 empty 成功 style .net () https

ASP.NET Forms 認證

Forms認證基礎

  1. HTTP是無狀態的協議,也就是說用戶的每次請求對服務器來說都是一次全新的請求,服務器不能識別這個請求是哪個用戶發送的。

  2. 那服務器如何去判斷一個用戶的請求呢?

  3. 答案是在每次請求發送時,附帶一些其他的信息來識別用戶的請求

  4. 對於Forms認證,每次的請求都攜帶同樣的cookie信息,將此信息發送給服務器,這樣服務器就可以識別這個請求到底是哪個用戶的。


ASP.NET Forms 認證基礎

  1. ASP.NET Request.IsAuthenticated為true 代表此用戶已經登陸

  2. 使用 HttpContext.User 來表用用戶的信息


ASP.NET Forms 認證過程

  1. ASP.NET 檢查當前的請求,並根據Web.config中配置的認證方式去構造HttpContext.User 供後續處理

  2. 後續可以通過判斷HttpContext.User 信息來識別用戶信息


ASP.NET Forms 登陸與註銷

  1. 使用vs2017 新建一個MVC程序,不進行身份驗證

  2. 在Web.config 的system.web 配置節新增Forms認證信息,內容如下

    <authentication mode="Forms" >
      <forms cookieless="UseCookies" name="FormsCookie" loginUrl="~/Home/Index.cshtml"></forms>
    </authentication>
  1. 我們使用 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>
  1. 後臺驗證密碼成功後跳轉到歡迎的頁面
        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");
            }
        }
  1. 在歡迎頁面如果已登錄顯示用戶名,如果未登錄顯示登錄地址進行登錄
<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 就可以識別此用戶後續的請求。這個方法幫我們做了如下流程:
用戶登錄流程

  1. 根據用戶名創建一個FormsAuthenticationTicket對象

  2. 調用FormsAuthenticatin.Encrypt() 進行加密

  3. 根據加密結果創建名稱為 FormsCookie (來自Web.config中的配置) 的cookie

  4. 將此cookie 寫入Response 返回給瀏覽器

  5. 瀏覽器在進行後續請求時會攜帶此cookie到服務端。

每次請求時的認證流程

  1. 瀏覽器在發送請求時攜帶cookie信息

  2. FormsAuthenticationModule 讀取cookie

  3. 從cookie中解析出FormsAuthenticationTicket 對象,過期的對象將被忽略

  4. 根據FormsAuthenticationTicket 對象構造 FormsIdentity對象並設置HttpContext.User

  5. ASP.NET 程序後續 HttpContext.User來判斷用戶信息

到此我們已經完成正整個認證流程。


更多詳細內容請參見大神 Fish Li (李奇峰)

ASP.NET Forms 認證流程