ASP.NET Core 2.0 MVC - 获取当前登录用户信息

一、前言

  上篇实战完成后,没想到会有那么多的圈友给了那么多的支持,甚至连只是作为代码仓储的git上也给了一些小星星,真的感觉很惶恐啊,哈哈哈,毕竟代码写的很烂啊。由于上一篇只是大概说了下项目,所以准备写下这篇详细说下自己对于获取当前登录用户的设计与实现,原本准备上周末就完成的这篇,结果周六一起来,发现自己起水痘了,嗯,很悲催。。。请了一个星期的假,今天好歹头不痛,不发烧能看电脑了,就努力努力赶出来吧。

 获取当前登录用户的整体思路,我们可以通过创建一个静态的用户类,存储当前登录的用户。通过将属性值存储在session中,从而存储到服务器的内存中,做到可以在系统全局中获取当前登录用户的数据信息。

  .NET Framework平台下面的MVC与.NET Core平台下面的MVC,对于Session的使用上存在着一些的差异,主要在于如何获取到Session对象。在传统的MVC项目中我们可以直接使用HttpContext.Current.Session获取到session,从而做到对于数据的取值、赋值;而在ASP.NET Core MVC中,并没有HttpContext.Current.Session这个静态类,通过查阅微软的文档可知,我们可以通过注入IHttpContextAccessor对象的方式从而获取到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这个静态类即可。在当时实际使用后发现,想要获取到登录后存储的用户信息,则必须在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     }

  登录成功后给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         }    

  这样就可以了,当需要使用到当前登录的用户信息时,直接CurrentUser.属性就可以了,整个项目的代码还是在项目实战的那个代码仓库中,地址点后面:源代码仓储,欢迎大家提出更好的解决方案啊。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏中科院渣渣博肆僧一枚

Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

6620
来自专栏DotNet Core圈圈

使用 Infer.NET 评价竞争对手

Infer.NET 是开放源代码的代码库,可用于创建概率性编程系统。我往往会将普通的计算机程序视作,主要基于有指定类型的值的变量(如有值“Q”的 char 变量...

9130
来自专栏云计算D1net

适用于多云世界的云合规策略

合规性从来都不是一件容易的事,企业的任何一个云计算承诺都可能让合作伙伴的基础设施中的一些应用程序、数据和流程陷入困境。尤其是多云模型,它为法规遵从性挑战带来新的...

8220
来自专栏一个爱瞎折腾的程序猿

三行脚本让 asp.net core 附加进程调试不再头痛

在将项目升级到 asp.net core 2.2 后,很少使用 IIS Express 运行项目了,基本都是控制台运行或者写个脚本批量启动要运行的接口(多个输出...

13630
来自专栏DotNet程序园

TomatoLog-1.1.0实现ILoggerFactory

The TomatoLog 是一个中间件,包含客户端、服务端,非常容易使用和部署。

8320
来自专栏雪雁的专栏

.NET如何生成大量随机数据

在演示Demo、数据库脱敏、性能测试中,有时需要生成大量随机数据。Bogus就是.NET中优秀的高性能、合理、支持多语言的随机数据生成库。

10640
来自专栏雪雁的专栏

.NET导出Excel的四种方法及评测

导出Excel是.NET的常见需求,开源社区、市场上,都提供了不少各式各样的Excel操作相关包。本文,我将使用NPOI、EPPlus、OpenXML、Aspo...

29710
来自专栏子翔的专栏

Go语言之旅:环境搭建

我是一名做了近十年的dotnet程序员,当然其中还使用过PHP、Javascript(NODEJS)去做过后端开发,从donnet Framework到现在的d...

16450
来自专栏dotNET名人堂

.NETCore Docker实现容器化与私有镜像仓库管理

Docker是用Go语言编写基于Linux操作系统的一些特性开发的,其提供了操作系统级别的抽象,是一种容器管理技术,它隔离了应用程序对基础架构(操作系统等)的...

11430
来自专栏Linyb极客之路

springboot实战之自定义注解扫描并动态注册bean

在项目开发中,我们可能会有这样的需求,通过注解配合AOP来实现一些业务额外功能,比如鉴权、日志记录等,更甚至我们可能会想通过注解,就可以把bean托管给spri...

1.8K30

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励