ASP.NET Core 2.0 MVC - 獲取當前登錄用戶信息

来源:https://www.cnblogs.com/danvic712/archive/2018/08/01/9062710.html
-Advertisement-
Play Games

一、前言 上篇實戰完成後,沒想到會有那麼多的圈友給了那麼多的支持,甚至連只是作為代碼倉儲的git上也給了一些小星星,真的感覺很惶恐啊,哈哈哈,畢竟代碼寫的很爛啊。由於上一篇只是大概說了下項目,所以準備寫下這篇詳細說下自己對於獲取當前登錄用戶的設計與實現,原本準備上周末就完成的這篇,結果周六一起來,發 ...


 一、前言

  上篇實戰完成後,沒想到會有那麼多的圈友給了那麼多的支持,甚至連只是作為代碼倉儲的git上也給了一些小星星,真的感覺很惶恐啊,哈哈哈,畢竟代碼寫的很爛啊。由於上一篇只是大概說了下項目,所以準備寫下這篇詳細說下自己對於獲取當前登錄用戶的設計與實現,原本準備上周末就完成的這篇,結果周六一起來,發現自己起水痘了,嗯,很悲催。。。請了一個星期的假,今天好歹頭不痛,不發燒能看電腦了,就努力努力趕出來吧。

  獲取當前登錄用戶的整體思路,我們可以通過創建一個靜態的用戶類,存儲當前登錄的用戶。通過將屬性值存儲在session中,從而存儲到伺服器的記憶體中,做到可以在系統全局中獲取當前登錄用戶的數據信息。

  .NET Framework平臺下麵的MVC與.NET Core平臺下麵的MVC,對於Session的使用上存在著一些的差異,主要在於如何獲取到Session對象。在傳統的MVC項目中我們可以直接使用HttpContext.Current.Session獲取到session,從而做到對於數據的取值、賦值;而在ASP.NET Core MVC中,並沒有HttpContext.Current.Session這個靜態類,通過查閱微軟的文檔可知,我們可以通過註入IHttpContextAccessor對象的方式從而獲取到session對象,解決方案如下所示。

 二、使用Session存儲當前登錄的用戶信息

   首先,在ASP.NET Core 中使用Session,我們需要將Session註入到ASP.NET Core的管道(pipeline)中,和我們使用MVC的方式相同,在ConfigureServices(IServiceCollection services)中,添加

1 services.AddSession();

  在Configure(IApplicationBuilder app, IHostingEnvironment env)中添加

1 app.UseSession();

  這樣,我們就可以在MVC中使用到Session了。當然現在也只是能在Controller中獲取到Session對象,如果想在別的類文件中使用到Session對象,我們需要註入IHttpContextAccessor對象。這裡,我們可以使用nuget添加Microsoft.AspNetCore.Http.Extensions這個程式集,方便我們對於Session進行操作。

  因為我們採用靜態類作為當前登錄用戶的載體,而靜態類不能擁有實例構造函數,所以我採用創建一個配置方法來進行註入,CurrentUser類如下所示。

 1     public static class CurrentUser
 2     {
 3         #region Initialize
 4 
 5         private static IHttpContextAccessor _httpContextAccessor;
 6 
 7         private static ISession _session => _httpContextAccessor.HttpContext.Session;
 8 
 9         public static void Configure(IHttpContextAccessor httpContextAccessor)
10         {
11             _httpContextAccessor = httpContextAccessor;
12         }
13 
14         #endregion
15 
16         #region Attribute
17 
18         /// <summary>
19         /// 用戶主鍵
20         /// </summary>
21         public static string UserOID
22         {
23             get => _session == null ? "" : _session.GetString("CurrentUser_UserOID");
24             set => _session.SetString("CurrentUser_UserOID", !string.IsNullOrEmpty(value) ? value : "");
25         }
26 
27         /// <summary>
28         ///用戶編號 
29         /// </summary>
30         public static long UserId
31         {
32             get => _session == null ? 0 : Convert.ToInt64(_session.GetString("CurrentUser_UserId"));
33             set => _session.SetString("CurrentUser_UserId", value != 0 ? value.ToString() : "0");
34         }
35 
36         /// <summary>
37         /// 用戶姓名
38         /// </summary>
39         public static string UserName
40         {
41             get => _session == null ? "" : _session.GetString("CurrentUser_UserName");
42             set => _session.SetString("CurrentUser_UserName", !string.IsNullOrEmpty(value) ? value : "");
43         }
44 
45         /// <summary>
46         /// 用戶登錄賬戶
47         /// </summary>
48         public static string UserAccount
49         {
50             get => _session == null ? "" : _session.GetString("CurrentUser_UserAccount");
51             set => _session.SetString("CurrentUser_UserAccount", !string.IsNullOrEmpty(value) ? value : "");
52         }
53 
54         /// <summary>
55         /// 用戶頭像地址
56         /// </summary>
57         public static string UserImage
58         {
59             get => _session == null ? "" : _session.GetString("CurrentUser_UserImage");
60             set => _session.SetString("CurrentUser_UserImage", !string.IsNullOrEmpty(value) ? value : "");
61         }
62 
63         /// <summary>
64         /// 用戶角色
65         /// </summary>
66         public static string UserRole
67         {
68             get => _session == null ? "" : _session.GetString("CurrentUser_UserRole");
69             set => _session.SetString("CurrentUser_UserRole", !string.IsNullOrEmpty(value) ? value : "");
70         }
71 
72         /// <summary>
73         /// 主頁地址
74         /// </summary>
75         public static string UserPage
76         {
77             get => _session == null ? "" : _session.GetString("CurrentUser_UserPage");
78             set => _session.SetString("CurrentUser_UserPage", !string.IsNullOrEmpty(value) ? value : "");
79         }
80 
81         #endregion
82     }
CurrentUser

   當我們創建好了這樣一個靜態類後,我們就可以在登錄成功後,將當前登錄的用戶信息賦值給這個靜態類,這樣我們就可以在需要使用到的地方直接使用CurrentUser這個靜態類即可。在當時實際使用後發現,想要獲取到登錄後存儲的用戶信息,則必須在Controller的構造方法中調用CurrentUser的Configure方法,無形中還是增加了許多的工作量。

  Controller的構造函數示例代碼如下:

 1     [Area("Administrator")]
 2     [Authorize(Policy = "Administrator")]
 3     public class HomeController : DanvicController
 4     {
 5         #region Initialize
 6 
 7         private readonly ApplicationDbContext _context;
 8         private readonly ILogger _logger;
 9         private readonly IHomeService _service;
10         private readonly IHttpContextAccessor _httpContextAccessor;
11         public HomeController(IHomeService service, ILogger<HomeController> logger, IHttpContextAccessor httpContextAccessor, ApplicationDbContext context)
12         {
13             _service = service;
14             _logger = logger;
15             _httpContextAccessor = httpContextAccessor;
16             _context = context;
17             CurrentUser.Configure(_httpContextAccessor);
18         }
19 
20         #endregion
21 
22         #region View
23 
24         #endregion
25     }
HomeController

  登錄成功後給CurrentUser賦值的相關代碼如下所示:

 1         /// <summary>
 2         /// 設置當前登錄用戶
 3         /// </summary>
 4         public async Task SetCurrentUser(string oid, IHttpContextAccessor httpContextAccessor, ApplicationDbContext context)
 5         {
 6             CurrentUser.Configure(httpContextAccessor);
 7 
 8             var user = await PSURepository.GetUserByOIDAsync(oid, context);
 9 
10             if (user != null)
11             {
12                 string role = string.Empty;
13                 switch (user.AccountType)
14                 {
15                     case 0:
16                         role = "Administrator";
17                         break;
18                     case 1:
19                         role = "Instructor";
20                         break;
21                     case 2:
22                         role = "Student";
23                         break;
24                 }
25 
26                 CurrentUser.UserAccount = user.Account;
27                 CurrentUser.UserId = user.Id;
28                 CurrentUser.UserImage = user.ImageSrc;
29                 CurrentUser.UserName = user.Name;
30                 CurrentUser.UserOID = user.IdentityUserOID;
31                 CurrentUser.UserRole = role;
32                 CurrentUser.UserPage = user.HomePage;
33             }
34         }    
SetCurrentUser

  這樣就可以了,當需要使用到當前登錄的用戶信息時,直接CurrentUser.屬性就可以了,整個項目的代碼還是在項目實戰的那個代碼倉庫中,地址點後面:源代碼倉儲,歡迎大家提出更好的解決方案啊。最後,還是要推廣下我的個人博客啊,點擊這裡,去看看我的博客,謝謝啦~~~


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

-Advertisement-
Play Games
更多相關文章
  • 租車系統 測試類 抽象類Car 子類ren (只能載人) 子類wu (只能載貨) 子類quan (都能載) 運行截圖 ...
  • 一、背景   我們都知道http協議只能瀏覽器單方面向伺服器發起請求獲得響應,伺服器不能主動向瀏覽器推送消息。想要實現瀏覽器的主動推送有兩種主流實現方式: 輪詢:缺點很多,但是實現簡單 websocket:在瀏覽器和伺服器之間建立tcp連接,實現全雙工通信  &emsp ...
  • 協程 引子 之前我們學習了線程、進程的概念,瞭解了在操作系統中進程是資源分配的最小單位,線程是CPU調度的最小單位。按道理來說我們已經算是把cpu的利用率提高很多了。但是我們知道無論是創建多進程還是創建多線程來解決問題,都要消耗一定的時間來創建進程、創建線程、以及管理他們之間的切換。 隨著我們對於效 ...
  • ORM的優劣勢? https://www.cnblogs.com/huanhang/p/6054908.html 對象關係映射(Object Relational Mapping,簡稱ORM)模式是一種為瞭解決面向對象與關係資料庫存在的互不匹配的現象的技術。 簡單的說,ORM是通過使用描述對象和數據 ...
  • 一:有如下變數(tu是個元祖),請實現要求的功能 tu = ("alex", [11, 22, {"k1": 'v1', "k2": ["age", "name"], "k3": (11,22,33)}, 44]) a. 講述元祖的特性 b. 請問tu變數中的第一個元素 "alex" 是否可被修改? ...
  • 重載與重寫對比: 重載: 許可權修飾符(public private 預設):無關 方法名:重載的兩個方法的方法名必須相同 形參列表: 形參類型的順序不同 形參的個數不同 形參的類型不同 三者至少滿足一個 返回值類型: 重載與返回值類型無關 重寫: 許可權修飾符(public private 預設): ...
  • C 多線程編程系列(二) 線程基礎 [TOC] 1.1 簡介 線程基礎主要包括線程創建、掛起、等待和終止線程。關於更多的線程的底層實現,CPU時間片輪轉等等的知識,可以參考 一書中關於進程和線程的章節,本文不過多贅述。 1.2 創建線程 在C 語言中,創建線程是一件非常簡單的事情;它只需要用到 命名 ...
  • 作為一個獨立開發者產品需要支付介面是挺麻煩的,支付寶微信都不對個人開放,註冊公司維護成本太高,市面上各種收款工具要麼手續費太高,要麼到賬很慢,體驗很不好。 看到 「小叮噹支付」 這個收款工具,挺有意思的。原理是監控手機微信、支付寶的二維碼掃碼支付到賬通知並回調開發者應用,通知開發者用戶的支付結果。 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...