【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做項目(5.5) 登錄功能的實現,完善登錄功能

来源:http://www.cnblogs.com/yuangang/archive/2016/05/24/5522700.html
-Advertisement-
Play Games

聲明:本系列為原創,分享本人現用框架,未經本人同意,禁止轉載!http://yuangang.cnblogs.com 希望大家好好一步一步做,所有的技術和項目,都毫無保留的提供,希望大家能自己跟著做一套,還有,請大家放心,只要大家喜歡,有人需要,絕對不會爛尾,我會堅持寫完~ 如果你感覺文章有幫助,點 ...


聲明:本系列為原創,分享本人現用框架,未經本人同意,禁止轉載!http://yuangang.cnblogs.com

希望大家好好一步一步做,所有的技術和項目,都毫無保留的提供,希望大家能自己跟著做一套,還有,請大家放心,只要大家喜歡,有人需要,絕對不會爛尾,我會堅持寫完~

如果你感覺文章有幫助,點一下推薦,讓更多的朋友參與進來,也是對本人勞動成果的鼓勵,謝謝大家!由於還要工作,所以基本都是犧牲午休時間來寫博客的,寫博客呢不是簡單的Ctrl+C、Ctrl+V,我是要挨著做一遍的,這也是對大家負責,所以有些時候更新不及時,或者問題沒有及時解答,希望大家諒解,再次感謝大家!!

因為我引用了許多以前積累的類庫,所以有些東西是重覆的(後來更新),有些東西是過時的,包括我寫的代碼,希望大家不要純粹的複製,取其精華去其糟粕>_<。

在項目最後我會把每個部分、每個階段的Demo提供下載給大家,其實,如果跟著做完,並且剔除掉了我代碼不好的地方,你也不需要這些Demo了,是吧~

索引

 【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做項目(1)搭建MVC環境 註冊區域

 【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做項目(2)創建資料庫和數據模型

 【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做項目(3)公共基礎數據操作類 RepositoryBase

 【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做項目(4)對前面的一些問題彙總和總結

 【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做項目(5.1) 登錄功能的實現,開始接觸Spring IOC、DI

【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做項目(5.2) 登錄功能的實現,介面註入、log4net的使用

【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做項目(5.3) 登錄功能的實現,豐富數據表、建立關聯

【無私分享:從入門到精通ASP.NET MVC】從0開始,一起搭框架、做項目(5.4) 登錄功能的實現,創建與登錄用戶相關的介面和實現類

簡述

今天我們來完善我們的登錄功能

項目準備

我們用的工具是:VS 2013 + SqlServer 2012 + IIS7.5

希望大家對ASP.NET MVC有一個初步的理解,理論性的東西我們不做過多解釋,有些地方不理解也沒關係,會用就行了,用的多了,用的久了,自然就理解了。

項目開始

一、我們先來豐富一下登錄頁面

我隨便從網上Down了個登錄頁,大家可以套上自己的登錄頁,我們前面做了個簡單的登錄頁,只有用戶名和密碼,現在我們增加一個驗證碼

首先,我們新建個驗證碼的類 verify_code.cs  我們就建在 Models文件夾下麵吧

相信很多朋友都有驗證碼的生成類,這裡只給新手朋友提供一下參考

驗證碼生成類

  1 using System.Drawing.Imaging;
  2 using System.IO;
  3 using System.Linq;
  4 using System.Web;
  5 
  6 namespace Models
  7 {
  8     /// <summary>
  9     /// 驗證碼構造類
 10     /// add yuangang by 2015-05-10
 11     /// </summary>
 12     public class verify_code
 13     {
 14         /// <summary>  
 15         /// 該方法用於生成指定位數的隨機數  
 16         /// </summary>  
 17         /// <param name="VcodeNum">參數是隨機數的位數</param>  
 18         /// <returns>返回一個隨機數字元串</returns>  
 19         private string RndNum(int VcodeNum)
 20         {
 21             //驗證碼可以顯示的字元集合  
 22             string Vchar = "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,p" +
 23                 ",q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,P,P,Q" +
 24                 ",R,S,T,U,V,W,X,Y,Z";
 25             string[] VcArray = Vchar.Split(new Char[] { ',' });//拆分成數組  
 26             string VNum = "";//產生的隨機數  
 27             int temp = -1;//記錄上次隨機數值,儘量避避免生產幾個一樣的隨機數  
 28 
 29             Random rand = new Random();
 30             //採用一個簡單的演算法以保證生成隨機數的不同  
 31             for (int i = 1; i < VcodeNum + 1; i++)
 32             {
 33                 if (temp != -1)
 34                 {
 35                     rand = new Random(i * temp * unchecked((int)DateTime.Now.Ticks));//初始化隨機類  
 36                 }
 37                 int t = rand.Next(61);//獲取隨機數  
 38                 if (temp != -1 && temp == t)
 39                 {
 40                     return RndNum(VcodeNum);//如果獲取的隨機數重覆,則遞歸調用  
 41                 }
 42                 temp = t;//把本次產生的隨機數記錄起來  
 43                 VNum += VcArray[t];//隨機數的位數加一  
 44             }
 45             return VNum;
 46         }
 47 
 48         /// <summary>  
 49         /// 該方法是將生成的隨機數寫入圖像文件  
 50         /// </summary>  
 51         /// <param name="VNum">VNum是一個隨機數</param>  
 52         public MemoryStream Create(out string VNum)
 53         {
 54             VNum = RndNum(4);
 55             Bitmap Img = null;
 56             Graphics g = null;
 57             MemoryStream ms = null;
 58             System.Random random = new Random();
 59             //驗證碼顏色集合  
 60             Color[] c = { Color.Black, Color.Red, Color.DarkBlue, Color.Green, Color.Orange, Color.Brown, Color.DarkCyan, Color.Purple };
 61             //驗證碼字體集合  
 62             string[] fonts = { "Verdana", "Microsoft Sans Serif", "Comic Sans MS", "Arial", "宋體" };
 63 
 64 
 65             //定義圖像的大小,生成圖像的實例  
 66             Img = new Bitmap((int)VNum.Length * 18, 32);
 67 
 68             g = Graphics.FromImage(Img);//從Img對象生成新的Graphics對象    
 69 
 70             g.Clear(Color.White);//背景設為白色  
 71 
 72             //在隨機位置畫背景點  
 73             for (int i = 0; i < 100; i++)
 74             {
 75                 int x = random.Next(Img.Width);
 76                 int y = random.Next(Img.Height);
 77                 g.DrawRectangle(new Pen(Color.LightGray, 0), x, y, 1, 1);
 78             }
 79             //驗證碼繪製在g中  
 80             for (int i = 0; i < VNum.Length; i++)
 81             {
 82                 int cindex = random.Next(7);//隨機顏色索引值  
 83                 int findex = random.Next(5);//隨機字體索引值  
 84                 Font f = new System.Drawing.Font(fonts[findex], 15, System.Drawing.FontStyle.Bold);//字體  
 85                 Brush b = new System.Drawing.SolidBrush(c[cindex]);//顏色  
 86                 int ii = 4;
 87                 if ((i + 1) % 2 == 0)//控制驗證碼不在同一高度  
 88                 {
 89                     ii = 2;
 90                 }
 91                 g.DrawString(VNum.Substring(i, 1), f, b, 3 + (i * 12), ii);//繪製一個驗證字元  
 92             }
 93             ms = new MemoryStream();//生成記憶體流對象  
 94             Img.Save(ms, ImageFormat.Jpeg);//將此圖像以Png圖像文件的格式保存到流中  
 95 
 96             //回收資源  
 97             g.Dispose();
 98             Img.Dispose();
 99             return ms;
100         }
101     }
102 }
View Code

好,我們在AccountController.cs下麵新建一個生成圖片的二進位圖片

好了,我們可以在登錄頁面插入這個圖片

帶驗證碼的完整的 登錄頁面表單就好了

 

二、我們增加驗證碼的功能

首先我們獲取一下表單驗證碼

然後我們應該先判斷一下 我們的驗證碼圖片是否過期 即 Session存儲的驗證碼 是否存在

我們在 Session存儲的驗證碼沒有過期 即 Session["gif"] != null 裡面判斷一下用戶輸入的驗證碼是否正確

我們把我們的登錄驗證 方法 放到 用戶驗證碼輸入正確的方法體裡面(如果用戶輸入的驗證碼不正確,我們就沒有必要驗證用戶信息了)

 

三、我們修改一下我們的驗證方法

驗證碼沒有過期,用戶輸入的驗證碼正確,這種情況下我們就應該驗證用戶信息了,前幾篇我們已經寫過驗證功能了,我們來修改完善一下

上一篇,我們驗證用戶信息真實的情況下,我們直接通過Json輸出了 Status="y",但是我們並沒有存儲用戶信息,今天我們來修改一下這個方法存儲用戶信息,我們通過兩種方式,首先通過Session存儲用戶信息,然後把用戶非關鍵信息加密後寫入Cookies,當Session過期的時候,我們就通過Cookies重新獲取用戶並存儲用戶信息,這是大致的流程 很多朋友會說這也不是很安全,是的,沒有絕對的安全,軟體是沒有絕對的100%安全的,我們只能在我們需求的情況下做到自己最好的安全。

我們在前一章寫了個用戶類Account 描述用戶的詳細信息,包括部門、許可權、崗位、角色等 我們通過用戶基礎表 來獲取一下這些信息

var acconut = this.UserManage.GetAccountByUser(users);

寫入當前用戶到Session中

1 //寫入Session 當前登錄用戶
2 SessionHelper.SetSession("CurrentUser", acconut);

記錄用戶ID、登錄名、密碼 到Cookies

1 //記錄用戶信息到Cookies
2  string cookievalue = "{\"id\":\"" + acconut.Id + "\",\"username\":\"" + acconut.LogName +
3                                                  "\",\"password\":\"" + acconut.PassWord + "\",\"ToKen\":\"" +
4                                                  Session.SessionID + "\"}";
5  CookieHelper.SetCookie("cookie_rememberme", new Common.CryptHelper.AESCrypt().Encrypt(cookievalue),null);

我們更新一下用戶本次登錄的IP

1  //更新用戶本次登錄IP
2  users.LastLoginIP = Utils.GetIP();
3  UserManage.Update(users);

如果驗證成功,我們跳轉到我們的管理中心首頁 

json.ReUrl = "/Sys/Home/Index";

這樣,我們的登錄就OK了

 

OK,下一篇我們來做許可權~~~

 

 

原創文章 轉載請尊重勞動成果 http://yuangang.cnblogs.com

 


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

-Advertisement-
Play Games
更多相關文章
  • ...
  • 這次要分享的是C#Task任務的幾個列子,感覺最實用的是封裝的分頁任務執行方法,這個方法步奏也是目前在我工作中執行多任務常用的,不知道各位也有這用的情況,那麼開始吧。 1.順序任務執行 1 //順序任務執行 2 Task.Factory.StartNew<int>(() => { Console.W ...
  • 關於面試中涉及到的事件的問題,我們只需要抓住幾個關鍵點就好了: 定義事件: 5 } ...
  • 上接 WCF學習之旅—WCF服務部署到IIS7.5(九) WCF學習之旅—WCF服務部署到應用程式(十) 七 WCF服務的Windows 服務程式寄宿 這種方式的服務寄宿,和IIS一樣有一個一樣的優點,系統啟動後,WCF服務也會跟著啟動了,不用人工干預,也是一種較好的寄宿方式。 (1) 在解決方案下 ...
  • 相關博文: "ASP.NET 5 Target framework dnx451 and dnxcore50" .NET Platform Standard:https://github.com/dotnet/corefx/blob/master/Documentation/architecture ...
  • ![圖片來自網路/圖文無關][0] 前言 在C 開發的WinForm窗體程式開發的時候,經常會使用多線程處理一些比較耗時之類的操作。不過會有一個問題:就是涉及到跨線程操作UI元素。 相信才開始接觸的人一定會遇上這個問題。 為瞭解決這個問題,可以通過委托來實現。 我為了後期使用更加方便,就將常用的幾個 ...
  • 擬合 概論 Gap的預測,是建立在一個擬合函數上的。也有一些機器學習的味道。 總的Gap函數 = 函數(時間,地區) TimeID : 時間片編號 DistricID:地區編號 Traffic:交通流量 Weather:天氣 POI:設施數 "百度地圖POI說明" 註意:每家公司的POI分類都是不同 ...
  • dataGridView_htList為一個 DataGridView(ht為HoverTree的縮寫)方法一:dataGridView_htList.Columns["HtAddTime"].HeaderText = "添加時間";其中HtAddTime為列的Name方法二:dataGridVie ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...