一、前言

  上篇实战完成后,没想到会有那么多的圈友给了那么多的支持,甚至连只是作为代码仓储的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)中,添加

 services.AddSession();

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

 app.UseSession();

  这样,我们就可以在MVC中使用到Session了。当然现在也只是能在Controller中获取到Session对象,如果想在别的类文件中使用到Session对象,我们需要注入IHttpContextAccessor对象。这里,我们可以使用nuget添加Microsoft.AspNetCore.Http.Extensions这个程序集,方便我们对于Session进行操作。

  因为我们采用静态类作为当前登录用户的载体,而静态类不能拥有实例构造函数,所以我采用创建一个配置方法来进行注入,CurrentUser类如下所示。

     public static class CurrentUser
{
#region Initialize private static IHttpContextAccessor _httpContextAccessor; private static ISession _session => _httpContextAccessor.HttpContext.Session; public static void Configure(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
} #endregion #region Attribute /// <summary>
/// 用户主键
/// </summary>
public static string UserOID
{
get => _session == null ? "" : _session.GetString("CurrentUser_UserOID");
set => _session.SetString("CurrentUser_UserOID", !string.IsNullOrEmpty(value) ? value : "");
} /// <summary>
///用户编号
/// </summary>
public static long UserId
{
get => _session == null ? : Convert.ToInt64(_session.GetString("CurrentUser_UserId"));
set => _session.SetString("CurrentUser_UserId", value != ? value.ToString() : "");
} /// <summary>
/// 用户姓名
/// </summary>
public static string UserName
{
get => _session == null ? "" : _session.GetString("CurrentUser_UserName");
set => _session.SetString("CurrentUser_UserName", !string.IsNullOrEmpty(value) ? value : "");
} /// <summary>
/// 用户登录账户
/// </summary>
public static string UserAccount
{
get => _session == null ? "" : _session.GetString("CurrentUser_UserAccount");
set => _session.SetString("CurrentUser_UserAccount", !string.IsNullOrEmpty(value) ? value : "");
} /// <summary>
/// 用户头像地址
/// </summary>
public static string UserImage
{
get => _session == null ? "" : _session.GetString("CurrentUser_UserImage");
set => _session.SetString("CurrentUser_UserImage", !string.IsNullOrEmpty(value) ? value : "");
} /// <summary>
/// 用户角色
/// </summary>
public static string UserRole
{
get => _session == null ? "" : _session.GetString("CurrentUser_UserRole");
set => _session.SetString("CurrentUser_UserRole", !string.IsNullOrEmpty(value) ? value : "");
} /// <summary>
/// 主页地址
/// </summary>
public static string UserPage
{
get => _session == null ? "" : _session.GetString("CurrentUser_UserPage");
set => _session.SetString("CurrentUser_UserPage", !string.IsNullOrEmpty(value) ? value : "");
} #endregion
}

CurrentUser

  当我们创建好了这样一个静态类后,我们就可以在登录成功后,将当前登录的用户信息赋值给这个静态类,这样我们就可以在需要使用到的地方直接使用CurrentUser这个静态类即可。在当时实际使用后发现,想要获取到登录后存储的用户信息,则必须在Controller的构造方法中调用CurrentUser的Configure方法,无形中还是增加了许多的工作量。

  Controller的构造函数示例代码如下:

     [Area("Administrator")]
[Authorize(Policy = "Administrator")]
public class HomeController : DanvicController
{
#region Initialize private readonly ApplicationDbContext _context;
private readonly ILogger _logger;
private readonly IHomeService _service;
private readonly IHttpContextAccessor _httpContextAccessor;
public HomeController(IHomeService service, ILogger<HomeController> logger, IHttpContextAccessor httpContextAccessor, ApplicationDbContext context)
{
_service = service;
_logger = logger;
_httpContextAccessor = httpContextAccessor;
_context = context;
CurrentUser.Configure(_httpContextAccessor);
} #endregion #region View #endregion
}

HomeController

  登录成功后给CurrentUser赋值的相关代码如下所示:

         /// <summary>
/// 设置当前登录用户
/// </summary>
public async Task SetCurrentUser(string oid, IHttpContextAccessor httpContextAccessor, ApplicationDbContext context)
{
CurrentUser.Configure(httpContextAccessor); var user = await PSURepository.GetUserByOIDAsync(oid, context); if (user != null)
{
string role = string.Empty;
switch (user.AccountType)
{
case :
role = "Administrator";
break;
case :
role = "Instructor";
break;
case :
role = "Student";
break;
} CurrentUser.UserAccount = user.Account;
CurrentUser.UserId = user.Id;
CurrentUser.UserImage = user.ImageSrc;
CurrentUser.UserName = user.Name;
CurrentUser.UserOID = user.IdentityUserOID;
CurrentUser.UserRole = role;
CurrentUser.UserPage = user.HomePage;
}
}

SetCurrentUser

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

ASP.NET Core 2.0 MVC - 获取当前登录用户信息的更多相关文章

  1. ASP.NET CORE 1.0 MVC API 文档用 SWASHBUCKLE SWAGGER实现

    from:https://damienbod.com/2015/12/13/asp-net-5-mvc-6-api-documentation-using-swagger/ 代码生成工具: https ...

  2. ASP.NET Core 2.0 MVC项目实战

    一.前言 毕业后入职现在的公司快有一个月了,公司主要的产品用的是C/S架构,再加上自己现在还在学习维护很老的delphi项目,还是有很多不情愿的.之前实习时主要是做.NET的B/S架构的项目,主要还是 ...

  3. asp.net core 3.0 MVC JSON 全局配置

    asp.net core 3.0 MVC JSON 全局配置 System.Text.Json(default) startup配置代码如下: using System.Text.Encodings. ...

  4. ASP.NET Core 5.0 中读取Request中Body信息

    ASP.NET Core 5.0 中读取Request中Body信息 记录一下如何读取Request中Body信息 public class ValuesController : Controller ...

  5. asp.net Core 2.0 MVC为Controller或Action添加定制特性实现登录验证

    前言:最近在倒腾 微软的新平台 asp.net Core 2.0,在这个过程中有些东西还是存在差异.下面是我在学习过程的一点笔记.有不妥之处,望各位大虾指正! 一.先创建一个控制器继承于Control ...

  6. .net core 2.0 mvc 获取配置信息

    mvc_core_config *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 ...

  7. spring oauth2获取当前登录用户信息。

    使用spring oauth2框架做授权鉴定.想获取当前用户信息怎么办? 我们知道spring oauth2是基于spring security的实现的. spring security可以通过Sec ...

  8. ASP.NET Core 2.0 MVC 发布部署--------- ASP.NET Core 发布的具体操作

    ASP.NET Core 发布的具体操作 下面使用C# 编写的ASP.NET Core Web项目示例说明发布的全过程. 1.创建项目 选择“文件” > “新建” > “项目”. 在“添加 ...

  9. ASP.NET Core 2.0 MVC 发布部署--------- IIS 具体操作

    .Net Core 部署到 IIS系统中的步骤 一.IIS 配置 启用 Web 服务器 (IIS) 角色并建立角色服务. 1.Windows Ddesktop 桌面操作系统(win7及更高版本) 导航 ...

随机推荐

  1. pojo,javabean与entitybean

    pojo:朴实无华的实体类 javabean:遵守某些规范的可重用的实体类 entitybean:与数据库中的数据记录对应的类 这个链接说的很明白!https://blog.csdn.net/chen ...

  2. IIS+Tomcat功能iis端口2

    之前写过IIS桥接Tomcat是通过isapi_redirect.dll,组件方式实现共用端口的,但是在Windows2012服务器 iis8.0版本中,配置完成后没有效果,比较抓狂,分析发现如下信息 ...

  3. python连接mysql数据库读取数据

    #-*- coding:utf-8 -*- #Author:'Lmc' #DATE: 2019/4/28/0028 上午 11:22:47 #FileName:test.PY import pymys ...

  4. MyIbatis和Hibernate的区别--2019-04-26

    1.MyBatis 真正实现了java代码和sql的分离 2.Hibernate 是全自动的,MyBatis是半自动的 Hibernate实现了部分自动生成SQL 3.SQL优化上 MyBatis 强 ...

  5. Python爬虫代理IP池

    目录[-] 1.问题 2.代理池设计 3.代码模块 4.安装 5.使用 6.最后 在公司做分布式深网爬虫,搭建了一套稳定的代理池服务,为上千个爬虫提供有效的代理,保证各个爬虫拿到的都是对应网站有效的代 ...

  6. MySQL索引背后的数据结构及算法原理(转)

    转自:http://blog.codinglabs.org/articles/theory-of-mysql-index.html 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话 ...

  7. FoxMail邮件设置

    最近部门变动,要求所有的沟通及交流都需要用企业邮箱,对于一般不喜欢看邮箱的我,经常会错过很多邮件.为了统一接收企业邮件及个人邮件,开始使用Foxmail(以前不喜欢整这些东西).下面分享一下FoxMa ...

  8. mysql基本命令总结

    1.在Ubuntu上安装MYSQL sudo apt-get install mysql-server sudo apt-get install mysql-client 2.安装结束后,用命令验证是 ...

  9. es6的基本数据详解

    一.Set 基本用法:   1)ES6提供了新的数据机构-Set. 它类似于数组,但是成员的值都是唯一的,没有重复的值.Set本身是一个构造函数,用来生成Set数据结构. 先来看一段最简单的代码: 1 ...

  10. linux configure 应用

    linux下configure命令详细介绍 2018年01月11日 15:02:20 冷月霜 阅读数:705 标签: configure 更多 个人分类: 数据库技术   Linux环境下的软件安装, ...