C# MVC 基於From的身份驗證

来源:https://www.cnblogs.com/SmileIven/archive/2018/08/31/9565154.html
-Advertisement-
Play Games

前言 昨天和一個技術比較好的前輩聊了聊,發現有的時候自己的學習方式有些問題,不知道有沒有和我一樣的越學習越感覺到知識的匱乏不過能認識到這個問題的同學們,也不要太心急路是一步一步走的飯是一口一口吃的認識到錯誤才能更高的改進錯誤,腳踏實地只要有上勁學習的心,終會有所成就。認識到自己薄弱的地方進行學習,要 ...


前言

昨天和一個技術比較好的前輩聊了聊,發現有的時候自己的學習方式有些問題,不知道有沒有和我一樣的越學習越感覺到知識的匱乏不過能認識到這個問題的同學們,也不要太心急路是一步一步走的飯是一口一口吃的認識到錯誤才能更高的改進錯誤,腳踏實地只要有上勁學習的心,終會有所成就。認識到自己薄弱的地方進行學習,要清楚學習的目的呀調理清晰:這個是什麼?為什麼要這樣?能解決什麼問題?入正題吧。

什麼是身份驗證

很多網站都有登錄對話框,讓事先已經註冊的用戶驗證,以便為他們提供個性化的服務等。可以把這個過程看作是兩件事情的發生:驗證和授權!登陸的作用是驗證請求登陸的用戶是否合法,而授權則是驗證合法的用戶在請求資源時,根據他們的許可權決定是訪問還是拒絕。

舉個例子:我們已經在一個網站上登錄了,你剛把網頁關閉發現又要使用這個網站於是乎你又打開了瀏覽器然後輸入了網址,這個時候你發現還要讓你登錄才能進行操作。頻繁的這樣是失去用戶極大的體驗效果所以這個時候就用到了身份驗證。

身份驗證是什麼?驗證和授權。為什麼要使用?加強用戶體驗效果。能解決什麼問題?節省用戶時間避免重覆性動作。

Form身份驗證思路

用戶要瀏覽需要許可權的頁面,此時,安全機制先啟動,檢查當前用戶請求是否持有用戶票據的Cookie如此Cookie存在:解析Cookie中的票據信息,獲得用戶角色,創建用戶標識或者對象。否則:認為用戶無權瀏覽該頁面,跳轉至登入頁面,登入成功後重定向到所請求頁面。

建立BaseController

建立BaseController繼承Controller,然後在其他Controller中用BaseController作為父類來繼承。我們在Base中實現From設置Ticket和寫入Cooike信息等操作。

        /// <summary>
        /// 保存用戶登陸信息
        /// </summary>
        public void WriteUserInfoToCookie(UserInfo userinfo)
        {
            var jss = new JavaScriptSerializer();
            var logonInfo = jss.Serialize(userinfo);

            //設置Ticket信息
            var ticket = new FormsAuthenticationTicket(1, userinfo.Name, DateTime.Now,
                                                       DateTime.Now.AddDays(1), false,
                                                       logonInfo);
            //加密驗證票據
            var strTicket = FormsAuthentication.Encrypt(ticket);
            //保存cookie
            SetCookie(FormsAuthentication.FormsCookieName, strTicket, ticket.Expiration, true);
        }

        /// <summary>
        /// 寫入Cooike
        /// </summary>
        /// <param name="cookiename"></param>
        /// <param name="value"></param>
        /// <param name="expires"></param>
        /// <param name="isSetExpires"></param>
        public static void SetCookie(string cookiename, string value, DateTime expires, bool isSetExpires)
        {
            var request = System.Web.HttpContext.Current.Request;
            var response = System.Web.HttpContext.Current.Response;
            var cookie = request.Cookies[cookiename] ?? new System.Web.HttpCookie(cookiename);
            cookie.Domain = FormsAuthentication.CookieDomain;
            if (value == null)
            {
                RemoveCookie(cookiename);
            }
            else
            {
                cookie.Value = value;

                //true代表客戶端只能讀,不能寫。只有服務端可寫,防止被篡改
                cookie.HttpOnly = true;

                if (isSetExpires)
                {
                    cookie.Expires = expires;
                }
            }
            response.Cookies.Add(cookie);
        }

        /// <summary>
        /// 移除指定名稱的cookie對象中的集合對
        /// </summary>
        /// <param name="cookieName">cookie名稱</param>
        public static void RemoveCookie(string cookieName)
        {
            var cookie = System.Web.HttpContext.Current.Request.Cookies[cookieName];
            var response = System.Web.HttpContext.Current.Response;
            if (cookie == null) return;
            cookie.Values.Clear();
            cookie.Domain = FormsAuthentication.CookieDomain;
            cookie.Expires = DateTime.Now.AddDays(-10000d);
            response.Cookies.Add(cookie);
        }

建立實體作為用戶登錄信息和寫入Cookie

    public class UserInfo
    {
        public string Name { get; set; }

        public string PassWord { get; set; }

    }

配置WebConfig

  <system.web>
    <authentication mode="Forms">
      <forms name="test" protection="All" loginUrl="~/account/default" timeout="2880" />
    </authentication>
  </system.web>

Forms Authentication相關的配置

有些同學會蒙圈為啥會配置authentication,下麵我們看下他們的信息
在web.config文件中,<system.web>/<authentication>配置節用於對驗證進行配置。為<authentication>節點提供mode="Forms"屬性可以啟用Forms Authentication。一個典型的<authentication>配置節如下所示:

<authentication mode="Forms">
     <forms
         name=".ASPXAUTH"
         loginUrl="login.aspx"
         defaultUrl="default.aspx"
         protection="All"
         timeout="30"
         path="/"
         requireSSL="false"
         slidingExpiration="false"
         enableCrossAppRedirects="false"
         cookieless="UseDeviceProfile"
         domain=""
     />
</authentication>

以上代碼使用的均是預設設置,換言之,如果你的哪項配置屬性與上述代碼一致,則可以省略該屬性。例如<forms name="MyAppAuth" />。下麵依次介紹一下各種屬性:

  • name——Cookie的名字。Forms Authentication可能會在驗證後將用戶憑證放在Cookie中,name屬性決定了該Cookie的名字。通過FormsAuthentication.FormsCookieName屬性可以得到該配置值(稍後介紹FromsAuthentication類)。
  • loginUrl——登錄頁的URL。通過FormsAuthentication.LoginUrl屬性可以得到該配置值。當調用FormsAuthentication.RedirectToLoginPage()方法時,客戶端請求將被重定向到該屬性所指定的頁面。loginUrl的預設值為“login.aspx”,這表明即便不提供該屬性值,ASP.NET也會嘗試到站點根目錄下尋找名為login.aspx的頁面。
  • defaultUrl——預設頁的URL。通過FormsAuthentication.DefaultUrl屬性得到該配置值。
  • protection——Cookie的保護模式,可取值包括All(同時進行加密和數據驗證)、Encryption(僅加密)、Validation(僅進行數據驗證)和None。為了安全,該屬性通常從不設置為None。
  • timeout——Cookie的過期時間。
  • path——Cookie的路徑。可以通過FormsAuthentication.FormsCookiePath屬性得到該配置值。
  • requireSSL——在進行Forms Authentication時,與伺服器交互是否要求使用SSL。可以通過FormsAuthentication.RequireSSL屬性得到該配置值。
  • slidingExpiration——是否啟用“彈性過期時間”,如果該屬性設置為false,從首次驗證之後過timeout時間後Cookie即過期;如果該屬性為true,則從上次請求該開始過timeout時間才過期,這意味著,在首次驗證後,如果保證每timeout時間內至少發送一個請求,則Cookie將永遠不會過期。通過FormsAuthentication.SlidingExpiration屬性可以得到該配置值。
  • enableCrossAppRedirects——是否可以將以進行了身份驗證的用戶重定向到其他應用程式中。通過FormsAuthentication.EnableCrossAppRedirects屬性可以得到該配置值。為了安全考慮,通常總是將該屬性設置為false。
  • cookieless——定義是否使用Cookie以及Cookie的行為。Forms Authentication可以採用兩種方式在會話中保存用戶憑據信息,一種是使用Cookie,即將用戶憑據記錄到Cookie中,每次發送請求時瀏覽器都會將該Cookie提供給伺服器。另一種方式是使用URI,即將用戶憑據當作URL中額外的查詢字元串傳遞給伺服器。該屬性有四種取值——UseCookies(無論何時都使用Cookie)、UseUri(從不使用Cookie,僅使用URI)、AutoDetect(檢測設備和瀏覽器,只有當設備支持Cookie並且在瀏覽器中啟用了Cookie時才使用Cookie)和UseDeviceProfile(只檢測設備,只要設備支持Cookie不管瀏覽器是否支持,都是用Cookie)。通過FormsAuthentication.CookieMode屬性可以得到該配置值。通過FormsAuthentication.CookiesSupported屬性可以得到對於當前請求是否使用Cookie傳遞用戶憑證。
  • domain——Cookie的域。通過FormsAuthentication.CookieDomain屬性可以得到該配置值。

驗證Ing

我們創建個Controller,我建立的是HomeController來進行測試

    public class HomeController : BaseCntroller
    {
        public ActionResult Index()
        {
            if (User.Identity.IsAuthenticated)
            {
                var strUser = ((FormsIdentity)User.Identity).Ticket.UserData;
                var _loginInfo = new UserInfo();
                if (strUser.Contains("{") && strUser.Contains("}"))
                {
                    var jss = new JavaScriptSerializer();
                    _loginInfo = jss.Deserialize<UserInfo>(strUser);
                }
                else
                {
                    //或者可以從緩存裡面取出
                }
                return Json(new { result = true });
            }
            else
            {
                UserInfo user = new UserInfo();
                user.Name = "焦海濤";
                user.PassWord = "123456";
                WriteUserInfoToCookie(user);
            }
            return View();
        }
    }

剛進來我們可以看到User的identity是flase說明我們沒有登錄過。那麼肯定是else來進行寫入我們的信息。

設置tick信息然後進行寫入cooike

 

 瀏覽器中可以看到我們使用的Cooike,這就是我們剛剛添加的。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 之前搞了很多次都是卡在了razor那個異常哪裡,今天心血來潮就在試一試,一試竟然成功了,激動的我趕緊記錄下歷程。廢話不說,走起。。。 ubuntu 16.04 安裝mono(最新版 5.14.0) 官網地址 https://www.mono-project.com/download/stable/# ...
  • 在日常的使用或者工作當中我們的vs會時不時的給我一些小“驚喜”。讓我們有時候無可奈何。這不今天我又遇到了所以我決定記錄下這些,方便以後再次出現好解決。 無法啟動iis express web 伺服器 在項目開發尤其是公司項目中,因為來回的切換項目時不時的會出現: 導致vs項目啟動不起來。這個時候首先 ...
  • 一、DataGridView 取得或者修改當前單元格的內容: 核心:DataGridView1.CurrentCell.Value; 1、當前單元格的Index: 列:DataGridView1.CurrentCell.ColumnIndex; 行:DataGridView1.CurrentCell ...
  • 因客戶需要實現PDF的預覽處理,在網上找了一些PDF線上預覽的解決方案,有的用PDFJS的線上預覽方式,有的使用PDFObject的嵌入式顯示,有的通過轉換JPG/PNG方式實現間接顯示的方式,開始是想通過簡單的方式,能夠使用JS插件實現預覽最好,可是線上預覽總是有一些不足,如不同瀏覽器的相容問題,... ...
  • 微信退款需要證書 data為已封裝好的xml數據 具體怎麼封裝>打開 ...
  • 在winForm窗體中綁定(註冊)事件的方法有兩種: 一、綁定事件 雙擊控制項,即進入.cs的代碼編輯頁面,會出現 類似於“ private void 控制項名稱_Click(object sender, DataGridViewCellEventArgs e){ } 的方法”,在”{ }“中添加邏輯代 ...
  • 最近需要對一個文件進行數量的分割,因為數據量龐大,所以就想到了通過寫程式來處理。將代碼貼出來以備以後使用。 //讀取文件的內容 放置於StringBuilder 中 StreamReader sr = new StreamReader(path, Encoding.Default); String ...
  • 根據GUID+DateTime.Now.Ticks生產唯一訂單號 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...