1. 程式人生 > 其它 >票據身份驗證並存入Cookie

票據身份驗證並存入Cookie

技術標籤:C#

C#票據身份驗證


前言


一、票據身份驗證是什麼?

C#票據身份驗證一般用於登入驗證存取使用者資訊以及判斷使用者是否登入

二、使用步驟

1.存入Cookie(資訊存入Cookie之後基本就可以通過Cookie是否存在去判斷使用者是否登入過)

程式碼如下(示例):

一般票據存取是在登入之後進行的操作,所以都是判斷使用者登入成功之後的操作。

首先配置web.config

<authentication mode="Forms">
      <forms name="loginName" loginUrl="/Home/Login" cookieless="UseCookies" path="/" protection="All" timeout="30"/>
    </authentication>

建立登入檢視模型viewmodel,以及dto檢視模型(模型驗證引用using System.ComponentModel.DataAnnotations;)

建立控制器的登入action
1、判斷模型驗證是否滿足要求
2、通過頁面獲取的檢視模型判斷賬號密碼是否正確,是否能找該使用者資訊(如果找到進行3,否則新增錯誤資訊,返回檢視)
3、獲取返回路徑,如果獲取到了跳到返回路徑對應路徑,否則跳到預設頁面ReturnUrl
4、登入成功則獲取使用者資訊並存入票據(using System.Web.Security;)
4.1、獲取使用者資料轉成json
4.2、建立票據FormsAuthenticationTicket(對票據進行加密FormsAuthentication.Encrypt)(https://technet.microsoft.com/zh-cn/library/system.web.security.formsauthenticationticket.version)

4.3、票據加密FormsAuthentication.Encrypt
4.4、建立Cookie HttpCookie()
4.5、獲取當前HTTP上下文 HttpContext;若為空則丟擲異常(throw new ArgumentNullException(“context為空”);)
4.6、寫入Cookie(https://www.cnblogs.com/tzyy/p/4151291.html)(先移除再新增)

            //4、登入成功則獲取使用者資訊並存入票據(using System.Web.Security;)
            //4.1、獲取使用者資料轉成json
            string userJson = adminDTO.ToJson();
            //4.2、建立票據FormsAuthenticationTicket(對票據進行加密FormsAuthentication.Encrypt)(https://technet.microsoft.com/zh-cn/library/system.web.security.formsauthenticationticket.version)        
            FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(2, "loginName", DateTime.Now, DateTime.Now.AddDays(1), false, userJson);
            //4.3、票據加密FormsAuthentication.Encrypt
            var encryptTicket = FormsAuthentication.Encrypt(ticket);
            //4.4、建立Cookie HttpCookie()
            HttpCookie httpCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptTicket);
            //4.5、獲取當前HTTP上下文 HttpContext; 若為空則丟擲異常(throw new ArgumentNullException("context為空");)
            httpCookie.Path = FormsAuthentication.FormsCookiePath;
            if (isRemeberMe)
            {
                httpCookie.Expires = DateTime.Now.AddDays(1);
            }
            //建立HttpContext上下文物件
            HttpContext httpContext = HttpContext.Current;

            //4.6、寫入Cookie(先移除再新增)
            httpContext.Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
            httpContext.Response.Cookies.Add(httpCookie);

2.在Global檔案中獲取Cookie值,解析Cookie值,拿到Cookie資訊在全域性中進行操作

在Global中註冊Application_AuthenticateRequest事件函式,用於解析客戶端發過來的Cookie資料
//1.通過sender獲取HttpApplication
//2.拿到HTTP上下文
//3.根據FormsAuthentication.FormsCookieName從上下文請求中獲取到Cookie
//4.解密cookie.Value獲得票據
//5.判斷票據的UserData,如果不為空則反序列化為實體
//6.將上下文中的User資料例項化,通過MyFormsPrincipal的建構函式 ticket,userData

程式碼如下(示例):

 //通過sender獲取HttpApplication
            HttpApplication app = sender as HttpApplication;
            //拿到一個HTTP上下文
            HttpContext httpContext = app.Context;
            //根據FormsAuthentication.FormsCookieName從下文中獲取Cookie
            var cookie = httpContext.Request.Cookies[FormsAuthentication.FormsCookieName];
            if (cookie!=null)
            {
                if (!string.IsNullOrWhiteSpace(cookie.Value))
                {
                    var ticket = FormsAuthentication.Decrypt(cookie.Value);
                    if (!string.IsNullOrWhiteSpace(ticket.UserData))
                    {
                        LoginAdminDTO userData = ticket.UserData.ToObject<LoginAdminDTO>();
                        //將上下文中的User資料例項化,通過MyFormsPrincipal的建構函式 ticket,userData
                        Context.User = new MyFormsPrincipalDTO<LoginAdminDTO>(ticket, userData);
                    }
                }
            }
            頁面例項化上下文User 獲取Cookie內容(全域性操作)
var user = User as MyFormsPrincipalDTO<LoginAdminDTO>;

該處使用的url網路請求的資料。


總結

提示:這裡對文章進行總結:
例如:文章是針對於登入之後的操作而進行的使用者身份認證以及身份資訊存取,當用戶登入之後將使用者資訊存取在Cookie中並進行加密(保護使用者隱私),並在Global設定全域性變數,以便於在專案其他版塊中獲取使用者資訊並進行操作,(登入加鹽加密在上一章總結中有提到)